diff --git a/examples/circom-demo/AveragePooling2D_stride_test.llzk b/examples/circom-demo/AveragePooling2D_stride_test.llzk new file mode 100644 index 0000000..4bd8da7 --- /dev/null +++ b/examples/circom-demo/AveragePooling2D_stride_test.llzk @@ -0,0 +1,711 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>>} { + poly.template @matElemSum_0 { + struct.def @matElemSum_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<9 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @SumPooling2D_1 { + struct.def @SumPooling2D_1 { + struct.member @out : !array.type<4,4,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> + struct.member @elemSum$inputs : !array.type<4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c9 = arith.constant {product_source = "compute"} 9 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %24 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%32, %33, %34] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %29 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38] = %35 : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%39, %40, %41] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %35[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @matElemSum_0::@matElemSum_0::@product(%46) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> + %48 = function.call @matElemSum_0::@matElemSum_0::@compute(%46) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %42[@comp] = %47 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %42 : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @compute(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c9 = arith.constant {product_source = "compute"} 9 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %21 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%29, %30, %31] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@a] = %26 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %34, %35] = %32 : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%36, %37, %38] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @matElemSum_0::@matElemSum_0::@compute(%43) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%45, %46, %47] = %39 : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <4,4,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, %arg1: !array.type<10,10,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <4,4,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <4,4,3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AveragePooling2D_2 { + struct.def @AveragePooling2D_2 { + struct.member @out : !array.type<4,4,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @sumPooling2D : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + struct.member @sumPooling2D$inputs : !pod.type<[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c10 = arith.constant 10 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_111 = felt.const 111 : <"babybear"> {product_source = "compute"} + %c300 = arith.constant {product_source = "compute"} 300 : index + %self = struct.new : <@AveragePooling2D_2::@AveragePooling2D_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c300 } : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13, %14, %15] = %11 : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %12 : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @SumPooling2D_1::@SumPooling2D_1::@product(%19) : (!array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + %21 = function.call @SumPooling2D_1::@SumPooling2D_1::@compute(%19) : (!array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %9[%10, %11, %12] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %13, %felt_const_111 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15, %16, %17] = %14 : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@sumPooling2D] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@sumPooling2D$inputs] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%8, %9, %10] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %3[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %12[%13, %14, %15] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %2[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %8[%9, %10, %11] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %12, %felt_const_111 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%14, %15, %16] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = pod.read %3[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_1::@SumPooling2D_1::@constrain(%2, %4) : (!struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<10,10,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> + } + function.def @compute(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c10 = arith.constant 10 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_111 = felt.const 111 : <"babybear"> {product_source = "compute"} + %c300 = arith.constant {product_source = "compute"} 300 : index + %self = struct.new : <@AveragePooling2D_2::@AveragePooling2D_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c300 } : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%4, %5, %6] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9, %10, %11] = %7 : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %8 : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = function.call @SumPooling2D_1::@SumPooling2D_1::@compute(%15) : (!array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %5[%6, %7, %8] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %9, %felt_const_111 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12, %13] = %10 : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>>, %arg1: !array.type<10,10,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c10 = arith.constant 10 : index + %c0 = arith.constant 0 : index + %felt_const_111 = felt.const 111 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@sumPooling2D] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sumPooling2D$inputs] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<10,10,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c10 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %11[%12, %13, %14] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<4,4,3 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %7[%8, %9, %10] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %11, %felt_const_111 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%13, %14, %15] : <4,4,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !array.type<10,10,3 x !felt.type<"babybear">>]>, !array.type<10,10,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_1::@SumPooling2D_1::@constrain(%1, %3) : (!struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<10,10,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/AveragePooling2D_test.llzk b/examples/circom-demo/AveragePooling2D_test.llzk new file mode 100644 index 0000000..41c4799 --- /dev/null +++ b/examples/circom-demo/AveragePooling2D_test.llzk @@ -0,0 +1,711 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>>} { + poly.template @matElemSum_0 { + struct.def @matElemSum_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @SumPooling2D_1 { + struct.def @SumPooling2D_1 { + struct.member @out : !array.type<2,2,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> + struct.member @elemSum$inputs : !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %24 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%32, %33, %34] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %29 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38] = %35 : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%39, %40, %41] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %35[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @matElemSum_0::@matElemSum_0::@product(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> + %48 = function.call @matElemSum_0::@matElemSum_0::@compute(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %42[@comp] = %47 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %42 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%29, %30, %31] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %34, %35] = %32 : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%36, %37, %38] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @matElemSum_0::@matElemSum_0::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%45, %46, %47] = %39 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AveragePooling2D_2 { + struct.def @AveragePooling2D_2 { + struct.member @out : !array.type<2,2,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @sumPooling2D : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + struct.member @sumPooling2D$inputs : !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_250 = felt.const 250 : <"babybear"> {product_source = "compute"} + %c75 = arith.constant {product_source = "compute"} 75 : index + %self = struct.new : <@AveragePooling2D_2::@AveragePooling2D_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c75 } : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13, %14, %15] = %11 : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %12 : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @SumPooling2D_1::@SumPooling2D_1::@product(%19) : (!array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + %21 = function.call @SumPooling2D_1::@SumPooling2D_1::@compute(%19) : (!array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %9[%10, %11, %12] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %13, %felt_const_250 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15, %16, %17] = %14 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@sumPooling2D] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@sumPooling2D$inputs] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %3[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %12[%13, %14, %15] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %2[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %8[%9, %10, %11] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %12, %felt_const_250 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%14, %15, %16] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = pod.read %3[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_1::@SumPooling2D_1::@constrain(%2, %4) : (!struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<5,5,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_250 = felt.const 250 : <"babybear"> {product_source = "compute"} + %c75 = arith.constant {product_source = "compute"} 75 : index + %self = struct.new : <@AveragePooling2D_2::@AveragePooling2D_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c75 } : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%4, %5, %6] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9, %10, %11] = %7 : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %8 : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = function.call @SumPooling2D_1::@SumPooling2D_1::@compute(%15) : (!array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %5[%6, %7, %8] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %9, %felt_const_250 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12, %13] = %10 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@AveragePooling2D_2::@AveragePooling2D_2<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_250 = felt.const 250 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@sumPooling2D] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sumPooling2D$inputs] : <@AveragePooling2D_2::@AveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %11[%12, %13, %14] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %7[%8, %9, %10] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %11, %felt_const_250 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%13, %14, %15] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_1::@SumPooling2D_1::@constrain(%1, %3) : (!struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<5,5,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/BatchNormalization_test.llzk b/examples/circom-demo/BatchNormalization_test.llzk new file mode 100644 index 0000000..4798b6b --- /dev/null +++ b/examples/circom-demo/BatchNormalization_test.llzk @@ -0,0 +1,125 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BatchNormalization2D_0::@BatchNormalization2D_0<[]>>} { + poly.template @BatchNormalization2D_0 { + struct.def @BatchNormalization2D_0 { + struct.member @out : !array.type<5,5,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_0::@BatchNormalization2D_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@BatchNormalization2D_0::@BatchNormalization2D_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@BatchNormalization2D_0::@BatchNormalization2D_0<[]>>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg2[%13] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16, %17, %18] = %15 : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%20] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %arg0[%22, %23, %24] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %21, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg2[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %26, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %0[%30, %31, %32] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@BatchNormalization2D_0::@BatchNormalization2D_0<[]>>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@BatchNormalization2D_0::@BatchNormalization2D_0<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_0::@BatchNormalization2D_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@BatchNormalization2D_0::@BatchNormalization2D_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg1[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%5, %6, %7] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %4, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg2[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13, %14, %15] = %12 : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BatchNormalization2D_0::@BatchNormalization2D_0<[]>>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BatchNormalization2D_0::@BatchNormalization2D_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BatchNormalization2D_0::@BatchNormalization2D_0<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>, %arg3: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BatchNormalization2D_0::@BatchNormalization2D_0<[]>>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg2[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%6, %7, %8] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg3[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%14, %15, %16] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/Conv1D_test.llzk b/examples/circom-demo/Conv1D_test.llzk new file mode 100644 index 0000000..9724ba4 --- /dev/null +++ b/examples/circom-demo/Conv1D_test.llzk @@ -0,0 +1,1104 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Conv1D_3::@Conv1D_3<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<4,1 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<4,1 x !felt.type<"babybear">>, %arg1: !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<4,1 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c4 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%3, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6, %c0] = %5 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<4,1 x !felt.type<"babybear">>, %arg2: !array.type<4,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.while (%arg4 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%2, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%4, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = scf.while (%arg4 = %felt_const_0, %arg5 = %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %12 = bool.cmp lt(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%12) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg4: !felt.type<"babybear">): + %12 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %14 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %16, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%20] = %19 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = scf.while (%arg4 = %felt_const_0, %arg5 = %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %12 = bool.cmp lt(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%12) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg4: !felt.type<"babybear">): + %12 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %12 { + %14 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %2[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %16, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %2[%20] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %13 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @compute(%arg0: !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.while (%arg3 = %felt_const_0, %arg4 = %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %5 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%5) %arg4 : !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">): + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%10, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<4,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.while (%arg4 = %felt_const_0, %arg5 = %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %8 = bool.cmp lt(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%8) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg4: !felt.type<"babybear">): + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %1[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%13, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<3 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Conv1D_3 { + struct.def @Conv1D_3 { + struct.member @out : !array.type<6,2 x !felt.type<"babybear">> {llzk.pub} + struct.member @mul : !array.type<6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> + struct.member @elemSum : !array.type<6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<20,3 x !felt.type<"babybear">>, %arg1: !array.type<4,3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Conv1D_3::@Conv1D_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@Conv1D_3::@Conv1D_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c8 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3, %arg4, %arg5] = %7 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %7 = array.read %array_1[%arg3, %arg4] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c3 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3, %arg4] = %7 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array_3[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3, %arg4, %arg5] = %7 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %7, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%13, %14] : <20,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%16, %17, %18] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21, %c0] = %15 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %25[@a] = %20 : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%26, %27, %28] = %25 : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array[%29, %30, %31] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %60 = pod.read %25[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %61 = pod.read %25[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %62 = function.call @matElemMul_0::@matElemMul_0::@compute(%60, %61) : (!array.type<4,1 x !felt.type<"babybear">>, !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %32[@comp] = %62 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %63 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%63, %64, %65] = %32 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %arg1[%36, %37, %38] : <4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_0[%40, %41, %42] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %44 = pod.read %43[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45, %c0] = %39 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array_0[%46, %47, %48] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %49[@b] = %44 : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%50, %51, %52] = %49 : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %53 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %array[%53, %54, %55] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %57 = pod.read %56[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %56[@count] = %58 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %60 = pod.read %49[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %61 = pod.read %49[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %62 = function.call @matElemMul_0::@matElemMul_0::@compute(%60, %61) : (!array.type<4,1 x !felt.type<"babybear">>, !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %56[@comp] = %62 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %63 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%63, %64, %65] = %56 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array[%11, %12, %13] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_4[%19, %20, %21] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %22[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24, %c0] = %18 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_4[%25, %26, %27] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %28[@a] = %23 : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%29, %30, %31] = %28 : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%32, %33, %34] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %28[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %40 = function.call @matElemSum_1::@matElemSum_1::@product(%39) : (!array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %41 = function.call @matElemSum_1::@matElemSum_1::@compute(%39) : (!array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %35[@comp] = %40 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %42 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%42, %43, %44] = %35 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_3[%20, %21, %22] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_2[%26, %27] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %25 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_2[%31, %32] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@in] = %29 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%34, %35] = %33 : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_1[%36, %37] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %42 = pod.read %33[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %43 = function.call @Sum_2::@Sum_2::@product(%42) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + %44 = function.call @Sum_2::@Sum_2::@compute(%42) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + pod.write %38[@comp] = %43 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %45 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%45, %46] = %38 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array_1[%9, %10] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg2[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%17, %18] = %16 : <6,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul$inputs] = %array_0 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_5[%arg3, %arg4, %arg5] = %8 : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul] = %array_5 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %array_2 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_6 = array.new : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %7 = array.read %array_1[%arg3, %arg4] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + array.write %array_6[%arg3, %arg4] = %8 : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum] = %array_6 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_4 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array_3[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_7[%arg3, %arg4, %arg5] = %8 : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_7 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@mul] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@mul$inputs] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %self[@sum] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "constrain"} + %4 = struct.readm %self[@sum$inputs] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %self[@elemSum] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@elemSum$inputs] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %7, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%13, %14] : <20,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%16, %17, %18] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg1[%23, %24, %25] : <4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %2[%27, %28, %29] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = pod.read %30[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %31[%32, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%11, %12, %13] : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %15 = struct.readm %14[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %6[%18, %19, %20] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %22[%23, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %5[%20, %21, %22] : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %4[%25, %26] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %3[%9, %10] : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %12 = struct.readm %11[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg2[%13] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%16, %17] : <6,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %1[%arg3, %arg4, %arg5] : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %8 = array.read %2[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">>, !array.type<4,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %7 = array.read %3[%arg3, %arg4] : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %8 = array.read %4[%arg3, %arg4] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %5[%arg3, %arg4, %arg5] : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %8 = array.read %6[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<4,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Conv1D_3::@Conv1D_3<[]>> + } + function.def @compute(%arg0: !array.type<20,3 x !felt.type<"babybear">>, %arg1: !array.type<4,3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Conv1D_3::@Conv1D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@Conv1D_3::@Conv1D_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c8 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3, %arg4, %arg5] = %0 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg3, %arg4] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3, %arg4] = %0 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3, %arg4, %arg5] = %0 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%6, %7] : <20,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%9, %10, %11] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %12[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14, %c0] = %8 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_0[%15, %16, %17] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@a] = %13 : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%19, %20, %21] = %18 : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%22, %23, %24] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %53 = pod.read %18[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %18[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @matElemMul_0::@matElemMul_0::@compute(%53, %54) : (!array.type<4,1 x !felt.type<"babybear">>, !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %25[@comp] = %55 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %56 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%56, %57, %58] = %25 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg1[%29, %30, %31] : <4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array_0[%33, %34, %35] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = pod.read %36[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38, %c0] = %32 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_0[%39, %40, %41] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %42[@b] = %37 : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%43, %44, %45] = %42 : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %46 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%46, %47, %48] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %42[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %42[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @matElemMul_0::@matElemMul_0::@compute(%53, %54) : (!array.type<4,1 x !felt.type<"babybear">>, !array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %49[@comp] = %55 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %56 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%56, %57, %58] = %49 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %array[%4, %5, %6] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %9[%10, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_4[%12, %13, %14] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %c0] = %11 : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_4[%18, %19, %20] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %21[@a] = %16 : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%22, %23, %24] = %21 : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_3[%25, %26, %27] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %21[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "compute"} + %33 = function.call @matElemSum_1::@matElemSum_1::@compute(%32) : (!array.type<4,1 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %28[@comp] = %33 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %34 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%34, %35, %36] = %28 : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_3[%13, %14, %15] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %17 = pod.read %16[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_2[%19, %20] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %21[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %18 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_2[%24, %25] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %26[@in] = %22 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%27, %28] = %26 : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_1[%29, %30] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %35 = pod.read %26[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %36 = function.call @Sum_2::@Sum_2::@compute(%35) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + pod.write %31[@comp] = %36 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %37 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%37, %38] = %31 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %array_1[%2, %3] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg2[%7] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10, %11] = %9 : <6,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul$inputs] = %array_0 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_5[%arg3, %arg4, %arg5] = %1 : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul] = %array_5 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %array_2 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_6 = array.new : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg3, %arg4] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + array.write %array_6[%arg3, %arg4] = %1 : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum] = %array_6 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_4 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <6,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_7[%arg3, %arg4, %arg5] = %1 : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_7 : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Conv1D_3::@Conv1D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv1D_3::@Conv1D_3<[]>>, %arg1: !array.type<20,3 x !felt.type<"babybear">>, %arg2: !array.type<4,3,2 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c6 = arith.constant {product_source = "constrain"} 6 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@mul] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mul$inputs] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@sum] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@sum$inputs] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@elemSum] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@elemSum$inputs] : <@Conv1D_3::@Conv1D_3<[]>>, !array.type<6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c6 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %7, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%13, %14] : <20,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%16, %17, %18] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg2[%23, %24, %25] : <4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %2[%27, %28, %29] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = pod.read %30[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %31[%32, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%11, %12, %13] : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %15 = struct.readm %14[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %6[%18, %19, %20] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %22[%23, %c0] : <4,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %5[%20, %21, %22] : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %4[%25, %26] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %3[%9, %10] : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %12 = struct.readm %11[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg3[%13] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%16, %17] : <6,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c6 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %1[%arg4, %arg5, %arg6] : <6,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %8 = array.read %2[%arg4, %arg5, %arg6] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<4,1 x !felt.type<"babybear">>, @b: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,1 x !felt.type<"babybear">>, !array.type<4,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c6 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %3[%arg4, %arg5] : <6,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %8 = array.read %4[%arg4, %arg5] : <6,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c6 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6] : <6,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %8 = array.read %6[%arg4, %arg5, %arg6] : <6,3,2 x !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,1 x !felt.type<"babybear">>]>, !array.type<4,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<4,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/Conv2D_stride_test.llzk b/examples/circom-demo/Conv2D_stride_test.llzk new file mode 100644 index 0000000..4bd34bb --- /dev/null +++ b/examples/circom-demo/Conv2D_stride_test.llzk @@ -0,0 +1,1256 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Conv2D_3::@Conv2D_3<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<4,4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<4,4 x !felt.type<"babybear">>, %arg1: !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<4,4 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c4 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg0[%2, %3] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%5, %6] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10] = %8 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<4,4 x !felt.type<"babybear">>, %arg2: !array.type<4,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = cast.toindex %2 : !felt.type<"babybear"> + %5 = array.read %arg1[%3, %4] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg2[%6, %7] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + %12 = array.read %0[%10, %11] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<16 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c15 = arith.constant 15 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c4 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @compute(%arg0: !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c15 = arith.constant 15 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<4,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c15 = arith.constant 15 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c4 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<3 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Conv2D_3 { + struct.def @Conv2D_3 { + struct.member @out : !array.type<3,3,2 x !felt.type<"babybear">> {llzk.pub} + struct.member @mul : !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> + struct.member @elemSum : !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>, %arg1: !array.type<4,4,3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c16 = arith.constant {product_source = "compute"} 16 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3, %arg4, %arg5, %arg6] = %7 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c16 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3, %arg4, %arg5, %arg6] = %7 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array_3[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c3 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3, %arg4, %arg5] = %7 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %7, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg0[%15, %18, %19] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%21, %22, %23, %24] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %20 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%29, %30, %31, %32] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@a] = %26 : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34, %35, %36, %37] = %33 : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %38 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%38, %39, %40, %41] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %76 = pod.read %33[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %33[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @matElemMul_0::@matElemMul_0::@compute(%76, %77) : (!array.type<4,4 x !felt.type<"babybear">>, !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %42[@comp] = %78 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %79 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%79, %80, %81, %82] = %42 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %46 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %arg1[%46, %47, %48, %49] : <4,4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_0[%51, %52, %53, %54] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %56 = pod.read %55[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %56[%57, %58] = %50 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_0[%59, %60, %61, %62] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %63[@b] = %56 : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%64, %65, %66, %67] = %63 : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %68 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %72 = array.read %array[%68, %69, %70, %71] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %73 = pod.read %72[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %72[@count] = %74 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %63[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %63[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @matElemMul_0::@matElemMul_0::@compute(%76, %77) : (!array.type<4,4 x !felt.type<"babybear">>, !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %72[@comp] = %78 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %79 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%79, %80, %81, %82] = %72 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array[%13, %14, %15, %16] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %18 = pod.read %17[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %19[%20, %21] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array_2[%23, %24, %25, %26] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %27[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29, %30] = %22 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_2[%31, %32, %33, %34] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %28 : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%36, %37, %38, %39] = %35 : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_1[%40, %41, %42, %43] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %35[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %49 = function.call @matElemSum_1::@matElemSum_1::@product(%48) : (!array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %50 = function.call @matElemSum_1::@matElemSum_1::@compute(%48) : (!array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %44[@comp] = %49 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %51 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%51, %52, %53, %54] = %44 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array_1[%23, %24, %25, %26] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %28 = pod.read %27[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_4[%30, %31, %32] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %33[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_4[%36, %37, %38] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %39[@in] = %34 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%40, %41, %42] = %39 : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %43 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %array_3[%43, %44, %45] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %47 = pod.read %46[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %46[@count] = %48 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %39[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %51 = function.call @Sum_2::@Sum_2::@product(%50) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + %52 = function.call @Sum_2::@Sum_2::@compute(%50) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + pod.write %46[@comp] = %51 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %53 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%53, %54, %55] = %46 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array_3[%10, %11, %12] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg2[%16] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19, %20, %21] = %18 : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %8 : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@mul$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_6 = array.new : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_6[%arg3, %arg4, %arg5, %arg6] = %8 : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array_3[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + array.write %array_7[%arg3, %arg4, %arg5] = %8 : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %self[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %4 = struct.readm %self[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %self[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %7, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %8, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%15, %18, %19] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%21, %22, %23, %24] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %26[%27, %28] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg1[%30, %31, %32, %33] : <4,4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %2[%35, %36, %37, %38] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = pod.read %39[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %40[%41, %42] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%13, %14, %15, %16] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %18[%19, %20] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %4[%22, %23, %24, %25] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = pod.read %26[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %27[%28, %29] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%23, %24, %25, %26] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %6[%29, %30, %31] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %33[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %5[%10, %11, %12] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg2[%15] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%18, %19, %20] : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %3[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %8 = array.read %4[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<4,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %1[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %8 = array.read %2[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">>, !array.type<4,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %5[%arg3, %arg4, %arg5] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %8 = array.read %6[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @compute(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>, %arg1: !array.type<4,4,3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c16 = arith.constant {product_source = "compute"} 16 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3, %arg4, %arg5, %arg6] = %0 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c16 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3, %arg4, %arg5, %arg6] = %0 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3, %arg4, %arg5] = %0 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%8, %11, %12] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_0[%14, %15, %16, %17] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %18[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20, %21] = %13 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_0[%22, %23, %24, %25] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %26[@a] = %19 : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%27, %28, %29, %30] = %26 : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%31, %32, %33, %34] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %69 = pod.read %26[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %70 = pod.read %26[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<4,4 x !felt.type<"babybear">>, !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %35[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %72 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%72, %73, %74, %75] = %35 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %39 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg1[%39, %40, %41, %42] : <4,4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_0[%44, %45, %46, %47] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %49 = pod.read %48[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50, %51] = %43 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %array_0[%52, %53, %54, %55] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %56[@b] = %49 : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%57, %58, %59, %60] = %56 : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %61 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %65 = array.read %array[%61, %62, %63, %64] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %66 = pod.read %65[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.subi %66, %c1 {product_source = "compute"} : index + pod.write %65[@count] = %67 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.cmpi eq, %67, %c0 {product_source = "compute"} : index + scf.if %68 { + %69 = pod.read %56[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %70 = pod.read %56[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<4,4 x !felt.type<"babybear">>, !array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %65[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %72 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%72, %73, %74, %75] = %65 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %array[%6, %7, %8, %9] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %12[%13, %14] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_2[%16, %17, %18, %19] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %20[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22, %23] = %15 : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_2[%24, %25, %26, %27] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %28[@a] = %21 : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%29, %30, %31, %32] = %28 : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_1[%33, %34, %35, %36] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %28[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @matElemSum_1::@matElemSum_1::@compute(%41) : (!array.type<4,4 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %37[@comp] = %42 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%43, %44, %45, %46] = %37 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_1[%16, %17, %18, %19] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %22 = struct.readm %21[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_4[%23, %24, %25] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %26[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %22 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_4[%29, %30, %31] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@in] = %27 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%33, %34, %35] = %32 : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_3[%36, %37, %38] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @Sum_2::@Sum_2::@compute(%43) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%45, %46, %47] = %39 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_3[%3, %4, %5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg2[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %1 : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@mul$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_6 = array.new : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_6[%arg3, %arg4, %arg5, %arg6] = %1 : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + array.write %array_7[%arg3, %arg4, %arg5] = %1 : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, %arg1: !array.type<10,10,3 x !felt.type<"babybear">>, %arg2: !array.type<4,4,3,2 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %7, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %8, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%15, %18, %19] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%21, %22, %23, %24] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %26[%27, %28] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg2[%30, %31, %32, %33] : <4,4,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %2[%35, %36, %37, %38] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = pod.read %39[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %40[%41, %42] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%13, %14, %15, %16] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %18[%19, %20] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %4[%22, %23, %24, %25] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = pod.read %26[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %27[%28, %29] : <4,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%23, %24, %25, %26] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %6[%29, %30, %31] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %33[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %5[%10, %11, %12] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg3[%15] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%18, %19, %20] : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c3 step %c1 { + scf.for %arg7 = %c0 to %c2 step %c1 { + %7 = array.read %3[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %8 = array.read %4[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<4,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c3 step %c1 { + scf.for %arg7 = %c0 to %c2 step %c1 { + %7 = array.read %1[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %8 = array.read %2[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<4,4 x !felt.type<"babybear">>, @b: !array.type<4,4 x !felt.type<"babybear">>]>, !array.type<4,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<4,4 x !felt.type<"babybear">>, !array.type<4,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %8 = array.read %6[%arg4, %arg5, %arg6] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/Conv2D_test.llzk b/examples/circom-demo/Conv2D_test.llzk new file mode 100644 index 0000000..134f197 --- /dev/null +++ b/examples/circom-demo/Conv2D_test.llzk @@ -0,0 +1,1253 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Conv2D_3::@Conv2D_3<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg0[%2, %3] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10] = %8 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = cast.toindex %2 : !felt.type<"babybear"> + %5 = array.read %arg1[%3, %4] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg2[%6, %7] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<9 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<3 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Conv2D_3 { + struct.def @Conv2D_3 { + struct.member @out : !array.type<3,3,2 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3,3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c18 = arith.constant {product_source = "compute"} 18 : index + %c9 = arith.constant {product_source = "compute"} 9 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3, %arg4, %arg5, %arg6] = %7 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array_1[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c3 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3, %arg4, %arg5] = %7 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %7[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3, %arg4, %arg5, %arg6] = %7 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg0[%15, %18, %19] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_4[%21, %22, %23, %24] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %20 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_4[%29, %30, %31, %32] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@a] = %26 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%34, %35, %36, %37] = %33 : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %38 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_3[%38, %39, %40, %41] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %76 = pod.read %33[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %33[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @matElemMul_0::@matElemMul_0::@compute(%76, %77) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %42[@comp] = %78 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %79 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%79, %80, %81, %82] = %42 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %46 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %arg1[%46, %47, %48, %49] : <3,3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_4[%51, %52, %53, %54] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %56 = pod.read %55[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %56[%57, %58] = %50 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_4[%59, %60, %61, %62] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %63[@b] = %56 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%64, %65, %66, %67] = %63 : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %68 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %72 = array.read %array_3[%68, %69, %70, %71] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %73 = pod.read %72[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %72[@count] = %74 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %63[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %63[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @matElemMul_0::@matElemMul_0::@compute(%76, %77) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %72[@comp] = %78 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %79 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%79, %80, %81, %82] = %72 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_3[%13, %14, %15, %16] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %18 = pod.read %17[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %19[%20, %21] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array_0[%23, %24, %25, %26] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %27[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29, %30] = %22 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%31, %32, %33, %34] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %28 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38, %39] = %35 : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%40, %41, %42, %43] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %35[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = function.call @matElemSum_1::@matElemSum_1::@product(%48) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %50 = function.call @matElemSum_1::@matElemSum_1::@compute(%48) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %44[@comp] = %49 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %51 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%51, %52, %53, %54] = %44 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array[%23, %24, %25, %26] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %28 = pod.read %27[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_2[%30, %31, %32] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %33[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_2[%36, %37, %38] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %39[@in] = %34 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%40, %41, %42] = %39 : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %43 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %array_1[%43, %44, %45] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %47 = pod.read %46[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %46[@count] = %48 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %39[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %51 = function.call @Sum_2::@Sum_2::@product(%50) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + %52 = function.call @Sum_2::@Sum_2::@compute(%50) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + pod.write %46[@comp] = %51 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %53 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%53, %54, %55] = %46 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array_1[%10, %11, %12] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg2[%16] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19, %20, %21] = %18 : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %8 : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_6 = array.new : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %array_1[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + array.write %array_6[%arg3, %arg4, %arg5] = %8 : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + struct.writem %self[@mul$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_7[%arg3, %arg4, %arg5, %arg6] = %8 : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %self[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "constrain"} + %4 = struct.readm %self[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %self[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%15, %18, %19] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%21, %22, %23, %24] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %26[%27, %28] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg1[%30, %31, %32, %33] : <3,3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %6[%35, %36, %37, %38] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = pod.read %39[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %40[%41, %42] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %5[%13, %14, %15, %16] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %18[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %2[%22, %23, %24, %25] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %27[%28, %29] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %1[%23, %24, %25, %26] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %4[%29, %30, %31] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %33[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%10, %11, %12] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg2[%15] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%18, %19, %20] : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %1[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %8 = array.read %2[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %7 = array.read %3[%arg3, %arg4, %arg5] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %8 = array.read %4[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %5[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %8 = array.read %6[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3,3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c18 = arith.constant {product_source = "compute"} 18 : index + %c9 = arith.constant {product_source = "compute"} 9 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3, %arg4, %arg5, %arg6] = %0 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3, %arg4, %arg5] = %0 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3, %arg4, %arg5, %arg6] = %0 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%8, %11, %12] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_4[%14, %15, %16, %17] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %18[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20, %21] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_4[%22, %23, %24, %25] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %26[@a] = %19 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%27, %28, %29, %30] = %26 : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%31, %32, %33, %34] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %69 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %70 = pod.read %26[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %35[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %72 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%72, %73, %74, %75] = %35 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %39 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg1[%39, %40, %41, %42] : <3,3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_4[%44, %45, %46, %47] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %49 = pod.read %48[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50, %51] = %43 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %array_4[%52, %53, %54, %55] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %56[@b] = %49 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%57, %58, %59, %60] = %56 : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %61 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %65 = array.read %array_3[%61, %62, %63, %64] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %66 = pod.read %65[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.subi %66, %c1 {product_source = "compute"} : index + pod.write %65[@count] = %67 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.cmpi eq, %67, %c0 {product_source = "compute"} : index + scf.if %68 { + %69 = pod.read %56[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %70 = pod.read %56[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %65[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %72 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%72, %73, %74, %75] = %65 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %array_3[%6, %7, %8, %9] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %12[%13, %14] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_0[%16, %17, %18, %19] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22, %23] = %15 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%24, %25, %26, %27] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %28[@a] = %21 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%29, %30, %31, %32] = %28 : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%33, %34, %35, %36] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @matElemSum_1::@matElemSum_1::@compute(%41) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %37[@comp] = %42 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%43, %44, %45, %46] = %37 : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%16, %17, %18, %19] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %22 = struct.readm %21[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_2[%23, %24, %25] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %26[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %22 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_2[%29, %30, %31] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@in] = %27 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%33, %34, %35] = %32 : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_1[%36, %37, %38] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @Sum_2::@Sum_2::@compute(%43) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%45, %46, %47] = %39 : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_1[%3, %4, %5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg2[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %1 : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_6 = array.new : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5] : <3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + array.write %array_6[%arg3, %arg4, %arg5] = %1 : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "compute"} + struct.writem %self[@mul$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <3,3,3,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_7[%arg3, %arg4, %arg5, %arg6] = %1 : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3,3,2 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%15, %18, %19] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%21, %22, %23, %24] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %26[%27, %28] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg2[%30, %31, %32, %33] : <3,3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %6[%35, %36, %37, %38] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = pod.read %39[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %40[%41, %42] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %5[%13, %14, %15, %16] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %18[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %2[%22, %23, %24, %25] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %27[%28, %29] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %1[%23, %24, %25, %26] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %4[%29, %30, %31] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %33[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%10, %11, %12] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg3[%15] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%18, %19, %20] : <3,3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c3 step %c1 { + scf.for %arg7 = %c0 to %c2 step %c1 { + %7 = array.read %1[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %8 = array.read %2[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c2 step %c1 { + %7 = array.read %3[%arg4, %arg5, %arg6] : <3,3,2 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> {product_source = "constrain"} + %8 = array.read %4[%arg4, %arg5, %arg6] : <3,3,2 x !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c3 step %c1 { + scf.for %arg7 = %c0 to %c2 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %8 = array.read %6[%arg4, %arg5, %arg6, %arg7] : <3,3,3,2 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/DecomposeProduct.llzk b/examples/circom-demo/DecomposeProduct.llzk new file mode 100644 index 0000000..2bdb837 --- /dev/null +++ b/examples/circom-demo/DecomposeProduct.llzk @@ -0,0 +1,139 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@DecomposeProduct_1::@DecomposeProduct_1<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : !felt.type<"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : !felt.type<"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : !felt.type<"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : !felt.type<"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : !felt.type<"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : !felt.type<"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + function.return {product_source = "constrain"} + } + } + } + poly.template @DecomposeProduct_1 { + struct.def @DecomposeProduct_1 { + struct.member @high : !array.type<8 x !felt.type<"babybear">> {llzk.pub, signal} + struct.member @low : !array.type<8 x !felt.type<"babybear">> {llzk.pub, signal} + struct.member @u16s : !array.type<8 x !felt.type<"babybear">> {signal} + struct.member @bits_low : !array.type<8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @bits_high : !array.type<8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@DecomposeProduct_1::@DecomposeProduct_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_256 = felt.const 256 : !felt.type<"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : !felt.type<"babybear"> + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@DecomposeProduct_1::@DecomposeProduct_1<[]>> {product_source = "compute"} + %array = array.new : <8 x !felt.type<"babybear">> {product_source = "compute"} + %array_0 = array.new : <8 x !felt.type<"babybear">> {product_source = "compute"} + %array_1 = array.new : <8 x !felt.type<"babybear">> {product_source = "compute"} + %array_2 = array.new : <8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + %array_3 = array.new : <8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + %0 = struct.readm %self[@u16s] : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@low] : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@high] : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@bits_low] : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %4 = struct.readm %self[@bits_high] : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %5 = array.read %arg0[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg1[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + + %x_pos = bool.cmp le(%felt_const_0, %5) : !felt.type<"babybear">, !felt.type<"babybear"> + %x_pos_smt = builtin.unrealized_conversion_cast %x_pos : i1 to !smt.bool + smt.assert %x_pos_smt + + %y_pos = bool.cmp le(%felt_const_0, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + %y_pos_smt = builtin.unrealized_conversion_cast %y_pos : i1 to !smt.bool + smt.assert %y_pos_smt + + %x_range = bool.cmp lt(%5, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> + %x_range_smt = builtin.unrealized_conversion_cast %x_range : i1 to !smt.bool + smt.assert %x_range_smt + + %y_range = bool.cmp lt(%6, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> + %y_range_smt = builtin.unrealized_conversion_cast %y_range : i1 to !smt.bool + smt.assert %y_range_smt + + %7 = felt.mul %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%arg2] = %7 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.smod %7, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%arg2] = %8 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %low_w_range = bool.cmp lt(%8, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> + %low_w_range_smt = builtin.unrealized_conversion_cast %low_w_range : i1 to !smt.bool + smt.assert %low_w_range_smt + + %low_w_pos = bool.cmp le(%felt_const_0, %8) : !felt.type<"babybear">, !felt.type<"babybear"> + %low_w_pos_smt = builtin.unrealized_conversion_cast %low_w_pos : i1 to !smt.bool + smt.assert %low_w_pos_smt + + array.write %array_2[%arg2] = %9 : <8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = felt.div %7, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.smod %10, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%arg2] = %11 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + + %12 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %high_w_range = bool.cmp lt(%11, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> + %high_w_range_smt = builtin.unrealized_conversion_cast %high_w_range : i1 to !smt.bool + smt.assert %high_w_range_smt + + %high_w_pos = bool.cmp le(%felt_const_0, %11) : !felt.type<"babybear">, !felt.type<"babybear"> + %high_w_pos_smt = builtin.unrealized_conversion_cast %high_w_pos : i1 to !smt.bool + smt.assert %high_w_pos_smt + + array.write %array_3[%arg2] = %12 : <8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %13 = array.read %arg0[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %3[%arg2] : <8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %18 = array.read %1[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%17, %18) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %low_c_range = bool.cmp lt(%18, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> + %low_c_range_smt = builtin.unrealized_conversion_cast %low_c_range : i1 to !smt.bool + smt.assert %low_c_range_smt + + %low_c_pos = bool.cmp le(%felt_const_0, %18) : !felt.type<"babybear">, !felt.type<"babybear"> + %low_c_pos_smt = builtin.unrealized_conversion_cast %low_c_pos : i1 to !smt.bool + smt.assert %low_c_pos_smt + + %19 = array.read %4[%arg2] : <8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %20 = array.read %2[%arg2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%19, %20) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %high_c_range = bool.cmp lt(%20, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> + %high_c_range_smt = builtin.unrealized_conversion_cast %high_c_range : i1 to !smt.bool + smt.assert %high_c_range_smt + + %high_c_pos = bool.cmp le(%felt_const_0, %20) : !felt.type<"babybear">, !felt.type<"babybear"> + %high_c_pos_smt = builtin.unrealized_conversion_cast %high_c_pos : i1 to !smt.bool + smt.assert %high_c_pos_smt + + %21 = felt.mul %20, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@u16s] = %array : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@low] = %array_1 : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@high] = %array_0 : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@bits_low] = %array_2 : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@bits_high] = %array_3 : <@DecomposeProduct_1::@DecomposeProduct_1<[]>>, !array.type<8 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + function.return %self : !struct.type<@DecomposeProduct_1::@DecomposeProduct_1<[]>> + } + } + } +} diff --git a/examples/circom-demo/Dense_test.llzk b/examples/circom-demo/Dense_test.llzk new file mode 100644 index 0000000..ce1701f --- /dev/null +++ b/examples/circom-demo/Dense_test.llzk @@ -0,0 +1,633 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Dense_3::@Dense_3<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<1,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>, %arg2: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<3 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_2 { + struct.def @matMul_2 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>, %arg1: !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_2::@matMul_2<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c6 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %16 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %32 = function.call @matElemMul_0::@matElemMul_0::@compute(%30, %31) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_1[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %26 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %32 = function.call @matElemMul_0::@matElemMul_0::@compute(%30, %31) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_1[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %19 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %24 = function.call @matElemSum_1::@matElemSum_1::@compute(%23) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemSumComp$inputs] = %array_0 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + struct.writem %self[@matElemSumComp] = %array_3 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@matElemMulComp$inputs] = %array_2 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + struct.writem %self[@matElemMulComp] = %array_4 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_2::@matMul_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_2::@matMul_2<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>, %arg2: !array.type<3,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemSumComp] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemMulComp] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %6 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%5, %7) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () + %8 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %9 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %10 = pod.read %9[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %11 = pod.read %9[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%8, %10, %11) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_3 { + struct.def @Dense_3 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> + struct.member @dot$inputs : !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Dense_3::@Dense_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c6 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3] = %3 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %13 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_0[%16] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %17[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%c0, %19] = %15 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_0[%20] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %21[@a] = %18 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%22] = %21 : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %43 = pod.read %21[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %21[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @matMul_2::@matMul_2::@compute(%43, %44) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %24[@comp] = %45 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg1[%28, %29] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%31] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34, %c0] = %30 : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array_0[%35] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %36[@b] = %33 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37] = %36 : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %38 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%38] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %36[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %36[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @matMul_2::@matMul_2::@compute(%43, %44) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %39[@comp] = %45 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46] = %39 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%4] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> {product_source = "compute"} + %8 = array.read %7[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg2[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12] = %11 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array_1[%arg3] = %4 : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@dot] = %array_1 : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@dot] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@dot$inputs] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %13 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%c0, %19] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%21, %22] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%4] : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg2[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg3] : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg3] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matMul_2::@matMul_2::@constrain(%3, %5, %6) : (!struct.type<@matMul_2::@matMul_2<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Dense_3::@Dense_3<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Dense_3::@Dense_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c6 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3] = %0 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_0[%13] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %14[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%c0, %16] = %12 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_0[%17] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@a] = %15 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%19] = %18 : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%20] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %40 = pod.read %18[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %18[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @matMul_2::@matMul_2::@compute(%40, %41) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %21[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%43] = %21 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg1[%25, %26] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_0[%28] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %29[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %30[%31, %c0] = %27 : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%32] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@b] = %30 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34] = %33 : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array[%35] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.subi %37, %c1 {product_source = "compute"} : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.cmpi eq, %38, %c0 {product_source = "compute"} : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %33[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @matMul_2::@matMul_2::@compute(%40, %41) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%43] = %36 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array[%1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg2[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array_1[%arg3] = %1 : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@dot] = %array_1 : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Dense_3::@Dense_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_3::@Dense_3<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>, %arg2: !array.type<3,2 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %0 = struct.readm %arg0[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@dot] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%c0, %19] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg2[%21, %22] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%4] : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg3[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg4] : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg4] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matMul_2::@matMul_2::@constrain(%3, %5, %6) : (!struct.type<@matMul_2::@matMul_2<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/Flatten2D_test.llzk b/examples/circom-demo/Flatten2D_test.llzk new file mode 100644 index 0000000..44af2ee --- /dev/null +++ b/examples/circom-demo/Flatten2D_test.llzk @@ -0,0 +1,112 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Flatten2D_0::@Flatten2D_0<[]>>} { + poly.template @Flatten2D_0 { + struct.def @Flatten2D_0 { + struct.member @out : !array.type<75 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_0::@Flatten2D_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_0::@Flatten2D_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<75 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Flatten2D_0::@Flatten2D_0<[]>>, !array.type<75 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4:2 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7:2 = scf.for %arg7 = %c0 to %c3 step %c1 iter_args(%arg8 = %arg5, %arg9 = %arg6) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%9, %10, %11] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %arg8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <75 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %arg8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%16, %17, %18] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%20] : <75 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %14, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %7#0, %7#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %4#0, %4#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Flatten2D_0::@Flatten2D_0<[]>>, !array.type<75 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@Flatten2D_0::@Flatten2D_0<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_0::@Flatten2D_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_0::@Flatten2D_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<75 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.for %arg3 = %c0 to %c5 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg5 = %c0 to %c3 step %c1 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%6, %7, %8] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <75 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %2 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Flatten2D_0::@Flatten2D_0<[]>>, !array.type<75 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Flatten2D_0::@Flatten2D_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Flatten2D_0::@Flatten2D_0<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Flatten2D_0::@Flatten2D_0<[]>>, !array.type<75 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = scf.for %arg6 = %c0 to %c3 step %c1 iter_args(%arg7 = %arg5) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %arg7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <75 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %5 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %3 : !felt.type<"babybear"> + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/GlobalAveragePooling2D_test.llzk b/examples/circom-demo/GlobalAveragePooling2D_test.llzk new file mode 100644 index 0000000..fe09145 --- /dev/null +++ b/examples/circom-demo/GlobalAveragePooling2D_test.llzk @@ -0,0 +1,561 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>} { + poly.template @matElemSum_0 { + struct.def @matElemSum_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<25 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<5,5 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c24 = arith.constant 24 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<25 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c24] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c24] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @compute(%arg0: !array.type<5,5 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c24 = arith.constant 24 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c5 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c24] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, %arg1: !array.type<5,5 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c24 = arith.constant 24 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<25 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c24] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GlobalSumPooling2D_1 { + struct.def @GlobalSumPooling2D_1 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> + struct.member @elemSum$inputs : !array.type<3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c25 = arith.constant {product_source = "compute"} 25 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c25 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %3 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%11, %12, %13] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_0[%15] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %16[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18, %19] = %14 : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_0[%20] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %21[@a] = %17 : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%22] = %21 : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %28 = pod.read %21[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @matElemSum_0::@matElemSum_0::@product(%28) : (!array.type<5,5 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> + %30 = function.call @matElemSum_0::@matElemSum_0::@compute(%28) : (!array.type<5,5 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %24[@comp] = %29 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %31 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%31] = %24 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%4] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %4 : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%11, %12, %13] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %2[%15] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %17[%18, %19] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%4] : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1] : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<5,5 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c25 = arith.constant {product_source = "compute"} 25 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c25 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %0 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array_0[%12] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %13[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15, %16] = %11 : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_0[%17] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@a] = %14 : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%19] = %18 : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%20] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %18[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @matElemSum_0::@matElemSum_0::@compute(%25) : (!array.type<5,5 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %21[@comp] = %26 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%27] = %21 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array[%1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %1 : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant 5 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %0 = struct.readm %arg0[@out] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%11, %12, %13] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %2[%15] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %17[%18, %19] : <5,5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%4] : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2] : <3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <3 x !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<5,5 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<5,5 x !felt.type<"babybear">>]>, !array.type<5,5 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<5,5 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GlobalAveragePooling2D_2 { + struct.def @GlobalAveragePooling2D_2 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @globalSumPooling2D : !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> + struct.member @globalSumPooling2D$inputs : !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %c75 = arith.constant {product_source = "compute"} 75 : index + %self = struct.new : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c75 } : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13, %14, %15] = %11 : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %12 : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @GlobalSumPooling2D_1::@GlobalSumPooling2D_1::@product(%19) : (!array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> + %21 = function.call @GlobalSumPooling2D_1::@GlobalSumPooling2D_1::@compute(%19) : (!array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %7[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %9, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@globalSumPooling2D$inputs] = %pod_0 : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@globalSumPooling2D] = %0 : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@globalSumPooling2D] : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@globalSumPooling2D$inputs] : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %3[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %12[%13, %14, %15] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %2[@out] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %6[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %8, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %1[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = pod.read %3[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GlobalSumPooling2D_1::@GlobalSumPooling2D_1::@constrain(%2, %4) : (!struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<5,5,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %c75 = arith.constant {product_source = "compute"} 75 : index + %self = struct.new : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c75 } : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%4, %5, %6] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9, %10, %11] = %7 : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %8 : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = function.call @GlobalSumPooling2D_1::@GlobalSumPooling2D_1::@compute(%15) : (!array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + %3 = struct.readm %2[@out] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %3[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@globalSumPooling2D$inputs] = %pod_0 : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@globalSumPooling2D] = %0 : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@globalSumPooling2D] : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@globalSumPooling2D$inputs] : <@GlobalAveragePooling2D_2::@GlobalAveragePooling2D_2<[]>>, !pod.type<[@in: !array.type<5,5,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %11[%12, %13, %14] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = struct.readm %1[@out] : <@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %5[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !array.type<5,5,3 x !felt.type<"babybear">>]>, !array.type<5,5,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GlobalSumPooling2D_1::@GlobalSumPooling2D_1::@constrain(%1, %3) : (!struct.type<@GlobalSumPooling2D_1::@GlobalSumPooling2D_1<[]>>, !array.type<5,5,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/GlobalMaxPooling2D_test.llzk b/examples/circom-demo/GlobalMaxPooling2D_test.llzk new file mode 100644 index 0000000..5ee9ec8 --- /dev/null +++ b/examples/circom-demo/GlobalMaxPooling2D_test.llzk @@ -0,0 +1,1139 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_2 { + struct.def @GreaterThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %26 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %23) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %10) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_3 { + struct.def @Switcher_3 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_3::@Switcher_3<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_3::@Switcher_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_3::@Switcher_3<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Max_4 { + struct.def @Max_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<26 x !felt.type<"babybear">> + struct.member @switchers : !array.type<26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> + struct.member @switchers$inputs : !array.type<26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @gts : !array.type<25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> + struct.member @gts$inputs : !array.type<25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<25 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c25 = arith.constant {product_source = "compute"} 25 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<26 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %11 = array.read %array[%arg1] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %11 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %11 = array.read %array_1[%arg1] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %11 : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%12] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_2[%14] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c1] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_2[%17] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@in] = %16 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%19] = %18 : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_1[%20] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %86 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@product(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + %88 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %21[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %89 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%89] = %21 : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%25] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_2[%27] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %29[%c0] = %26 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_2[%30] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %31[@in] = %29 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%32] = %31 : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_1[%33] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %86 = pod.read %31[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %34[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %88 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%88] = %34 : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_1[%38] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_0[%43] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %44[@sel] = %41 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%46] = %44 : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%48] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %86 = pod.read %44[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %44[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %44[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %49[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %49 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %53 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %nondet[%53] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_0[%56] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %57[@L] = %54 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%59] = %57 : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %60 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array[%61] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %63 = pod.read %62[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %62[@count] = %64 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %86 = pod.read %57[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %57[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %57[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %62[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %62 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %66 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %arg0[%66] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_0[%69] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %70[@R] = %67 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%72] = %70 : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %73 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %array[%74] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %76 = pod.read %75[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %75[@count] = %77 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %86 = pod.read %70[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %70[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %70[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %75[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %75 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %79 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%80] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %83 = struct.readm %82[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%85] = %83 : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c25] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %11 = array.read %array[%arg1] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %12 : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %11 = array.read %array_1[%arg1] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %12 : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<26 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<26 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %6 = struct.readm %self[@gts] : <@Max_4::@Max_4<[]>>, !array.type<25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %7 = struct.readm %self[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %8 = array.read %arg0[%c0] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %3[%c0] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%12] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %7[%14] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %7[%20] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%24] : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %5[%28] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %3[%31] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %5[%34] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg0[%37] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %5[%40] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %4[%44] : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %46 = struct.readm %45[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %3[%48] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = array.read %3[%c25] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %11 = array.read %4[%arg1] : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %12 = array.read %5[%arg1] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %12[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%11, %13, %14, %15) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %11 = array.read %6[%arg1] : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %12 = array.read %7[%arg1] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%11, %13) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @compute(%arg0: !array.type<25 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c25 = arith.constant {product_source = "compute"} 25 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<26 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %2 = array.read %array[%arg1] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %2 = array.read %array_1[%arg1] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %2 : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_2[%5] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_2[%8] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%10] = %9 : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_1[%11] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %77 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %12[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79] = %12 : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_2[%18] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_2[%21] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%23] = %22 : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_1[%24] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %77 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %25[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79] = %25 : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_1[%29] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%34] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37] = %35 : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %77 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %40 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_0[%47] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%50] = %48 : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %77 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %53 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_0[%60] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%63] = %61 : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %77 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %66[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %66 : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %72 = array.read %array[%71] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %73 = pod.read %72[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %74 = struct.readm %73[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%76] = %74 : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c25] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %2 = array.read %array[%arg1] : <26 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %3 : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %2 = array.read %array_1[%arg1] : <25 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %3 : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<26 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Max_4::@Max_4<[]>>, %arg1: !array.type<25 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c25 = arith.constant {product_source = "constrain"} 25 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c26 = arith.constant {product_source = "constrain"} 26 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<26 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<26 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@gts] : <@Max_4::@Max_4<[]>>, !array.type<25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%c0] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c25 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %1[%10] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %5[%12] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = array.read %14[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %5[%18] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %4[%22] : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %1[%29] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %3[%32] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg1[%35] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %3[%38] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %2[%42] : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %44 = struct.readm %43[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = array.read %1[%c25] : <26 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c26 step %c1 { + %9 = array.read %2[%arg2] : <26 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %10 = array.read %3[%arg2] : <26 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %10[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %10[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%9, %11, %12, %13) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c25 step %c1 { + %9 = array.read %4[%arg2] : <25 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %10 = array.read %5[%arg2] : <25 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%9, %11) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GlobalMaxPooling2D_5 { + struct.def @GlobalMaxPooling2D_5 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @max : !array.type<3 x !struct.type<@Max_4::@Max_4<[]>>> + struct.member @max$inputs : !array.type<3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %c25 = arith.constant {product_source = "compute"} 25 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c25 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %3 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%11, %12, %13] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_0[%15] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %16[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %18 = felt.mul %9, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %18, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%20] = %14 : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_0[%21] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %17 : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%23] = %22 : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%24] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %29 = pod.read %22[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Max_4::@Max_4::@product(%29) : (!array.type<25 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> + %31 = function.call @Max_4::@Max_4::@compute(%29) : (!array.type<25 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + pod.write %25[@comp] = %30 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%32] = %25 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%4] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max$inputs] = %array_0 : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %4 : <3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max] = %array_1 : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@max] : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@max$inputs] : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%11, %12, %13] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %2[%15] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = felt.mul %9, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %18, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %17[%20] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%4] : <3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1] : <3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Max_4::@Max_4::@constrain(%3, %5) : (!struct.type<@Max_4::@Max_4<[]>>, !array.type<25 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %c25 = arith.constant {product_source = "compute"} 25 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c25 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %0 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array_0[%12] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %13[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %15 = felt.mul %6, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %15, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%17] = %11 : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%18] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %19[@in] = %14 : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%20] = %19 : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array[%21] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %19[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @Max_4::@Max_4::@compute(%26) : (!array.type<25 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + pod.write %22[@comp] = %27 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %28 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%28] = %22 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array[%1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max$inputs] = %array_0 : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %1 : <3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max] = %array_1 : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant 5 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@max] : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@max$inputs] : <@GlobalMaxPooling2D_5::@GlobalMaxPooling2D_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%11, %12, %13] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %2[%15] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = felt.mul %9, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %18, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %17[%20] : <25 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%4] : <3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2] : <3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <3 x !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<25 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<25 x !felt.type<"babybear">>]>, !array.type<25 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Max_4::@Max_4::@constrain(%3, %5) : (!struct.type<@Max_4::@Max_4<[]>>, !array.type<25 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/IsNegative_test.llzk b/examples/circom-demo/IsNegative_test.llzk new file mode 100644 index 0000000..87d6262 --- /dev/null +++ b/examples/circom-demo/IsNegative_test.llzk @@ -0,0 +1,884 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@IsNegative_4::@IsNegative_4<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_2 { + struct.def @CompConstant_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg4, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg3, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg2, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %41, %38, %39, %40 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#1 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_1::@Num2Bits_1::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %20 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg4, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg3, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg2, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %40, %39, %38, %41 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%11, %17) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg4, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg5, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg3, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg2, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %31, %28, %29, %30 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#1 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_0, %arg6 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg3, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg5, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg4, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg3, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %32, %31, %30, %33 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%3, %9) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sign_3 { + struct.def @Sign_3 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %11 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @CompConstant_2::@CompConstant_2::@product(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> + %24 = function.call @CompConstant_2::@CompConstant_2::@compute(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %4 : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %5 : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_2::@CompConstant_2::@constrain(%1, %7) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Sign_3::@Sign_3<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @CompConstant_2::@CompConstant_2::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %1 : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %2 : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sign_3::@Sign_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_3::@Sign_3<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_2::@CompConstant_2::@constrain(%1, %4) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsNegative_4 { + struct.def @IsNegative_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @num2Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @num2Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @sign : !struct.type<@Sign_3::@Sign_3<[]>> + struct.member @sign$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsNegative_4::@IsNegative_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsNegative_4::@IsNegative_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %16 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %17 = function.call @Num2Bits_0::@Num2Bits_0::@product(%16) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %18 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%16) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %17 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = struct.readm %self[@out] : <@IsNegative_4::@IsNegative_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %self[@num2Bits] : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@num2Bits$inputs] : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = struct.readm %self[@sign] : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@sign$inputs] : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = pod.read %5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %18[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %21 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %24 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %33 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Sign_3::@Sign_3::@product(%33) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> + %35 = function.call @Sign_3::@Sign_3::@compute(%33) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %34 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %7[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %10 = struct.readm %9[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@IsNegative_4::@IsNegative_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_2 : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %11 : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_0 : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %12 : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %13 = struct.readm %6[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %7[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_3::@Sign_3::@constrain(%6, %14) : (!struct.type<@Sign_3::@Sign_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %15 = pod.read %5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%4, %15) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsNegative_4::@IsNegative_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsNegative_4::@IsNegative_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsNegative_4::@IsNegative_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %7 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%7) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %8 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %9[%10] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %12 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %15 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %18 = function.call @Sign_3::@Sign_3::@compute(%17) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %18 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %4 = struct.readm %3[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsNegative_4::@IsNegative_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_2 : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %5 : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_0 : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %6 : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsNegative_4::@IsNegative_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsNegative_4::@IsNegative_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@IsNegative_4::@IsNegative_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@num2Bits] : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@num2Bits$inputs] : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@sign] : <@IsNegative_4::@IsNegative_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@sign$inputs] : <@IsNegative_4::@IsNegative_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %3[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_3::@Sign_3::@constrain(%3, %7) : (!struct.type<@Sign_3::@Sign_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %8) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/IsPositive_test.llzk b/examples/circom-demo/IsPositive_test.llzk new file mode 100644 index 0000000..296082a --- /dev/null +++ b/examples/circom-demo/IsPositive_test.llzk @@ -0,0 +1,891 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@IsPositive_4::@IsPositive_4<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_2 { + struct.def @CompConstant_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg4, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg2, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %38, %41, %40, %39 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#0 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_1::@Num2Bits_1::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %20 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg4, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg2, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %41, %40, %38, %39 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%11, %17) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg5, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg4, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg2, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %28, %31, %30, %29 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#0 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0, %arg6 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg6, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg5, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %33, %32, %30, %31 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%3, %9) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sign_3 { + struct.def @Sign_3 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %11 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @CompConstant_2::@CompConstant_2::@product(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> + %24 = function.call @CompConstant_2::@CompConstant_2::@compute(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %4 : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %5 : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_2::@CompConstant_2::@constrain(%1, %7) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Sign_3::@Sign_3<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @CompConstant_2::@CompConstant_2::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %1 : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %2 : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sign_3::@Sign_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_3::@Sign_3<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_2::@CompConstant_2::@constrain(%1, %4) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsPositive_4 { + struct.def @IsPositive_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sign : !struct.type<@Sign_3::@Sign_3<[]>> + struct.member @sign$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @num2Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @num2Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %18 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_0::@Num2Bits_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %20 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = struct.readm %self[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %self[@sign] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@sign$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@num2Bits] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@num2Bits$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %23 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %26 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %35 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %36 = function.call @Sign_3::@Sign_3::@product(%35) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> + %37 = function.call @Sign_3::@Sign_3::@compute(%35) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %36 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %6[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %5[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %10 = struct.readm %9[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.sub %felt_const_1, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_2 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %12 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_0 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %13 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %14 = struct.readm %4[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%6, %16) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_3::@Sign_3::@constrain(%4, %17) : (!struct.type<@Sign_3::@Sign_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsPositive_4::@IsPositive_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %13 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %18 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @Sign_3::@Sign_3::@compute(%18) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %4 = struct.readm %3[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_2 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %6 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_0 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %7 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsPositive_4::@IsPositive_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sign] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sign$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2Bits] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2Bits$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %1[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %8) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %9 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_3::@Sign_3::@constrain(%1, %9) : (!struct.type<@Sign_3::@Sign_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/MaxPooling2D_stride_test.llzk b/examples/circom-demo/MaxPooling2D_stride_test.llzk new file mode 100644 index 0000000..c58849d --- /dev/null +++ b/examples/circom-demo/MaxPooling2D_stride_test.llzk @@ -0,0 +1,1246 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_2 { + struct.def @GreaterThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %26 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %23) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %10) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_3 { + struct.def @Switcher_3 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_3::@Switcher_3<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_3::@Switcher_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_3::@Switcher_3<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Max_4 { + struct.def @Max_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<5 x !felt.type<"babybear">> + struct.member @switchers : !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> + struct.member @switchers$inputs : !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @gts : !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> + struct.member @gts$inputs : !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %11 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %11 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_2[%14] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c1] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_2[%17] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@in] = %16 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%19] = %18 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_1[%20] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %86 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@product(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + %88 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %21[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %89 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%89] = %21 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_2[%27] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %29[%c0] = %26 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_2[%30] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %31[@in] = %29 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%32] = %31 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_1[%33] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %86 = pod.read %31[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %34[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %88 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%88] = %34 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_1[%38] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_0[%43] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %44[@sel] = %41 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%46] = %44 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%48] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %86 = pod.read %44[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %44[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %44[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %49[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %49 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %53 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %nondet[%53] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_0[%56] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %57[@L] = %54 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%59] = %57 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %60 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array[%61] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %63 = pod.read %62[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %62[@count] = %64 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %86 = pod.read %57[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %57[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %57[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %62[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %62 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %66 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %arg0[%66] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_0[%69] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %70[@R] = %67 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%72] = %70 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %73 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %array[%74] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %76 = pod.read %75[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %75[@count] = %77 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %86 = pod.read %70[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %70[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %70[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %75[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %75 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %79 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%80] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %83 = struct.readm %82[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%85] = %83 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %12 : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %12 : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %6 = struct.readm %self[@gts] : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %7 = struct.readm %self[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %8 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %3[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %7[%14] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %7[%20] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%24] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %5[%28] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %3[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %5[%34] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg0[%37] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %5[%40] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %4[%44] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %46 = struct.readm %45[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %3[%48] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = array.read %3[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %4[%arg1] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %12 = array.read %5[%arg1] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %12[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%11, %13, %14, %15) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %6[%arg1] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %12 = array.read %7[%arg1] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%11, %13) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %2 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %2 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_2[%5] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_2[%8] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%10] = %9 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_1[%11] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %77 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %12[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79] = %12 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_2[%18] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_2[%21] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%23] = %22 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_1[%24] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %77 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %25[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79] = %25 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_1[%29] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%34] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37] = %35 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %77 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %40 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_0[%47] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%50] = %48 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %77 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %53 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_0[%60] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%63] = %61 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %77 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %66[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %66 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %72 = array.read %array[%71] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %73 = pod.read %72[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %74 = struct.readm %73[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%76] = %74 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %2 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %3 : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %3 : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Max_4::@Max_4<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@gts] : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %1[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %5[%12] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = array.read %14[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %5[%18] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %4[%22] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %1[%29] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %3[%32] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg1[%35] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %3[%38] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %2[%42] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %44 = struct.readm %43[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = array.read %2[%arg2] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %10 = array.read %3[%arg2] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %10[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %10[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%9, %11, %12, %13) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = array.read %4[%arg2] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %10 = array.read %5[%arg2] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%9, %11) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @MaxPooling2D_5 { + struct.def @MaxPooling2D_5 { + struct.member @out : !array.type<3,3,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @max : !array.type<3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> + struct.member @max$inputs : !array.type<3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@MaxPooling2D_5::@MaxPooling2D_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %30 = felt.mul %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %30, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%32] = %24 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array_0[%33, %34, %35] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %36[@in] = %29 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37, %38, %39] = %36 : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array[%40, %41, %42] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@count] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %43[@count] = %45 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %36[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @Max_4::@Max_4::@product(%47) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> + %49 = function.call @Max_4::@Max_4::@compute(%47) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + pod.write %43[@comp] = %48 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %50 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%50, %51, %52] = %43 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max$inputs] = %array_0 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max] = %array_1 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@max] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@max$inputs] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = felt.mul %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %30, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %29[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Max_4::@Max_4::@constrain(%3, %5) : (!struct.type<@Max_4::@Max_4<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> + } + function.def @compute(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@MaxPooling2D_5::@MaxPooling2D_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = felt.mul %12, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %27, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%29] = %21 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%30, %31, %32] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@in] = %26 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34, %35, %36] = %33 : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%37, %38, %39] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %44 = pod.read %33[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Max_4::@Max_4::@compute(%44) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + pod.write %40[@comp] = %45 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %46 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46, %47, %48] = %40 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max$inputs] = %array_0 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max] = %array_1 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>>, %arg1: !array.type<10,10,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@max] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@max$inputs] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = felt.mul %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %30, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %29[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <3,3,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <3,3,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Max_4::@Max_4::@constrain(%3, %5) : (!struct.type<@Max_4::@Max_4<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/MaxPooling2D_test.llzk b/examples/circom-demo/MaxPooling2D_test.llzk new file mode 100644 index 0000000..e107d52 --- /dev/null +++ b/examples/circom-demo/MaxPooling2D_test.llzk @@ -0,0 +1,1243 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_2 { + struct.def @GreaterThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %26 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %23) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %10) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_3 { + struct.def @Switcher_3 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_3::@Switcher_3<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_3::@Switcher_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_3::@Switcher_3<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Max_4 { + struct.def @Max_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<5 x !felt.type<"babybear">> + struct.member @switchers : !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> + struct.member @switchers$inputs : !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @gts : !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> + struct.member @gts$inputs : !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %11 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %11 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_2[%14] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c1] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_2[%17] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@in] = %16 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%19] = %18 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_1[%20] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %86 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@product(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + %88 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %21[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %89 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%89] = %21 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_2[%27] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %29[%c0] = %26 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_2[%30] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %31[@in] = %29 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%32] = %31 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_1[%33] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %86 = pod.read %31[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %34[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %88 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%88] = %34 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_1[%38] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_0[%43] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %44[@sel] = %41 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%46] = %44 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%48] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %86 = pod.read %44[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %44[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %44[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %49[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %49 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %53 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %nondet[%53] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_0[%56] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %57[@L] = %54 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%59] = %57 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %60 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array[%61] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %63 = pod.read %62[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %62[@count] = %64 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %86 = pod.read %57[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %57[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %57[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %62[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %62 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %66 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %arg0[%66] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_0[%69] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %70[@R] = %67 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%72] = %70 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %73 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %array[%74] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %76 = pod.read %75[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %75[@count] = %77 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %86 = pod.read %70[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %70[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %70[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %75[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%91] = %75 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %79 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%80] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %83 = struct.readm %82[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%85] = %83 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %12 : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %12 : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %6 = struct.readm %self[@gts] : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %7 = struct.readm %self[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %8 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %3[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %7[%14] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %7[%20] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%24] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %5[%28] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %3[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %5[%34] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg0[%37] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %5[%40] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %4[%44] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %46 = struct.readm %45[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %3[%48] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = array.read %3[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %4[%arg1] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %12 = array.read %5[%arg1] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %12[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%11, %13, %14, %15) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %6[%arg1] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %12 = array.read %7[%arg1] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%11, %13) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %2 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %2 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_2[%5] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_2[%8] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%10] = %9 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_1[%11] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %77 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %12[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79] = %12 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_2[%18] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_2[%21] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%23] = %22 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_1[%24] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %77 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %25[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79] = %25 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_1[%29] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%34] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37] = %35 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %77 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %40 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_0[%47] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%50] = %48 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %77 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %53 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_0[%60] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%63] = %61 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %77 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %66[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82] = %66 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %72 = array.read %array[%71] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %73 = pod.read %72[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %74 = struct.readm %73[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%76] = %74 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %2 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %3 : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array_1[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %3 : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Max_4::@Max_4<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@gts] : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %1[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %5[%12] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = array.read %14[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %5[%18] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %4[%22] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %1[%29] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %3[%32] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg1[%35] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %3[%38] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %2[%42] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %44 = struct.readm %43[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = array.read %2[%arg2] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %10 = array.read %3[%arg2] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %10[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %10[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%9, %11, %12, %13) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = array.read %4[%arg2] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %10 = array.read %5[%arg2] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%9, %11) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @MaxPooling2D_5 { + struct.def @MaxPooling2D_5 { + struct.member @out : !array.type<2,2,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @max : !array.type<2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> + struct.member @max$inputs : !array.type<2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@MaxPooling2D_5::@MaxPooling2D_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %30 = felt.mul %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %30, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%32] = %24 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array_0[%33, %34, %35] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %36[@in] = %29 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37, %38, %39] = %36 : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array[%40, %41, %42] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@count] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %43[@count] = %45 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %36[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @Max_4::@Max_4::@product(%47) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> + %49 = function.call @Max_4::@Max_4::@compute(%47) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + pod.write %43[@comp] = %48 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %50 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%50, %51, %52] = %43 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max$inputs] = %array_0 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max] = %array_1 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@max] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@max$inputs] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = felt.mul %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %30, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %29[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Max_4::@Max_4::@constrain(%3, %5) : (!struct.type<@Max_4::@Max_4<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@MaxPooling2D_5::@MaxPooling2D_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = felt.mul %12, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %27, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%29] = %21 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%30, %31, %32] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@in] = %26 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34, %35, %36] = %33 : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%37, %38, %39] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %44 = pod.read %33[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Max_4::@Max_4::@compute(%44) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + pod.write %40[@comp] = %45 : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %46 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46, %47, %48] = %40 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max$inputs] = %array_0 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Max_4::@Max_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@max] = %array_1 : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@MaxPooling2D_5::@MaxPooling2D_5<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@max] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !struct.type<@Max_4::@Max_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@max$inputs] : <@MaxPooling2D_5::@MaxPooling2D_5<[]>>, !array.type<2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = felt.mul %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %30, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %29[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <2,2,3 x !struct.type<@Max_4::@Max_4<[]>>>, !struct.type<@Max_4::@Max_4<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <2,2,3 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Max_4::@Max_4::@constrain(%3, %5) : (!struct.type<@Max_4::@Max_4<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/Max_test.llzk b/examples/circom-demo/Max_test.llzk new file mode 100644 index 0000000..e0c5190 --- /dev/null +++ b/examples/circom-demo/Max_test.llzk @@ -0,0 +1,909 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Max_4::@Max_4<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_2 { + struct.def @GreaterThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %26 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %23) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %10) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_3 { + struct.def @Switcher_3 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_3::@Switcher_3<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_3::@Switcher_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_3::@Switcher_3<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Max_4 { + struct.def @Max_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<5 x !felt.type<"babybear">> + struct.member @gts : !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> + struct.member @gts$inputs : !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @switchers : !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> + struct.member @switchers$inputs : !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %11 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %array_1[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %11 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_0[%14] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c1] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_0[%17] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %18[@in] = %16 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%19] = %18 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%20] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %86 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@product(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + %88 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %21[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %89 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%89] = %21 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%27] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %29[%c0] = %26 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_0[%30] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %31[@in] = %29 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%32] = %31 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array[%33] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %86 = pod.read %31[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%86) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %34[@comp] = %87 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %88 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%88] = %34 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%38] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_2[%43] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %44[@sel] = %41 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%46] = %44 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array_1[%48] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %86 = pod.read %44[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %44[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %44[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %49[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %49 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %53 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %nondet[%53] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_2[%56] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %57[@L] = %54 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%59] = %57 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %60 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array_1[%61] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %63 = pod.read %62[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %62[@count] = %64 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %86 = pod.read %57[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %57[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %57[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %62[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %62 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %66 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %arg0[%66] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_2[%69] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %70[@R] = %67 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%72] = %70 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %73 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %array_1[%74] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %76 = pod.read %75[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %75[@count] = %77 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %86 = pod.read %70[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %70[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %70[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = function.call @Switcher_3::@Switcher_3::@compute(%86, %87, %88) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %75[@comp] = %89 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %90 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %75 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %79 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_1[%80] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %83 = struct.readm %82[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%85] = %83 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %12 : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_4 = array.new : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %array_1[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %12 : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@gts] : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %6 = struct.readm %self[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %7 = struct.readm %self[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %8 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %3[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %5[%14] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %5[%20] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %4[%24] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %7[%28] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %3[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %7[%34] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg0[%37] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %7[%40] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %6[%44] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %46 = struct.readm %45[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %3[%48] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = array.read %3[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %11 = array.read %4[%arg1] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %12 = array.read %5[%arg1] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%11, %13) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %11 = array.read %6[%arg1] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %12 = array.read %7[%arg1] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %12[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%11, %13, %14, %15) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Max_4::@Max_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@Max_4::@Max_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %2 = array.read %array_1[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1] = %2 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_0[%5] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_0[%8] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%10] = %9 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%11] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %77 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %12[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%79] = %12 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%18] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_0[%21] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%23] = %22 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%24] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %77 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%77) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %25[@comp] = %78 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %79 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%79] = %25 : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array[%29] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_2[%34] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%37] = %35 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_1[%39] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %77 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%82] = %40 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_2[%47] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%50] = %48 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_1[%52] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %77 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%82] = %53 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_2[%60] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%63] = %61 : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_1[%65] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %77 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Switcher_3::@Switcher_3::@compute(%77, %78, %79) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + pod.write %66[@comp] = %80 : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %81 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%82] = %66 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %72 = array.read %array_1[%71] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %73 = pod.read %72[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + %74 = struct.readm %73[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%76] = %74 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_0 : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %3 : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_3 : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_2 : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_4 = array.new : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %2 = array.read %array_1[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_3::@Switcher_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + array.write %array_4[%arg1] = %3 : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_4 : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Max_4::@Max_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Max_4::@Max_4<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant {product_source = "constrain"} 5 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Max_4::@Max_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@gts] : <@Max_4::@Max_4<[]>>, !array.type<4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@gts$inputs] : <@Max_4::@Max_4<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@switchers] : <@Max_4::@Max_4<[]>>, !array.type<5 x !struct.type<@Switcher_3::@Switcher_3<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@switchers$inputs] : <@Max_4::@Max_4<[]>>, !array.type<5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %1[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%12] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = array.read %14[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %5[%26] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %1[%29] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %5[%32] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg1[%35] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %5[%38] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %4[%42] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %44 = struct.readm %43[@outL] : <@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = array.read %2[%arg2] : <4 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %10 = array.read %3[%arg2] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%9, %11) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %9 = array.read %4[%arg2] : <5 x !struct.type<@Switcher_3::@Switcher_3<[]>>>, !struct.type<@Switcher_3::@Switcher_3<[]>> {product_source = "constrain"} + %10 = array.read %5[%arg2] : <5 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %10[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %10[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_3::@Switcher_3::@constrain(%9, %11, %12, %13) : (!struct.type<@Switcher_3::@Switcher_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/Num2Bits.llzk b/examples/circom-demo/Num2Bits.llzk new file mode 100644 index 0000000..c01eb50 --- /dev/null +++ b/examples/circom-demo/Num2Bits.llzk @@ -0,0 +1,97 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/README.md b/examples/circom-demo/README.md new file mode 100644 index 0000000..5ac6b30 --- /dev/null +++ b/examples/circom-demo/README.md @@ -0,0 +1,53 @@ +# Circom Demo Examples + +This directory holds Circom benchmarks lowered to LLZK and then normalized for +LLEQ demos. + +## Regenerating The Example Set + +Recompile the Circom benchmarks with the concrete backend in +`/Users/raghav/Veridise/circom-benchmarks`, then import them here: + +```bash +python3 scripts/import_circom_demo_examples.py +``` + +The import script scans `~/Veridise/circom-benchmarks/llzk-outputs`, extracts +each benchmark's `llzk.main` root struct, and runs: + +```text +--llzk-while-to-for +--llzk-compute-constrain-to-product=root-struct= +--llzk-fuse-product-loops +--canonicalize +``` + +Successful outputs are copied into this directory as flat `.llzk` files. The +script also writes `import_manifest.csv` with preprocessing successes and +failures. + +## Collecting Verification Data + +Run: + +```bash +python3 scripts/collect_circom_demo_results.py +``` + +For each imported benchmark, the script runs: + +```text +lleq verify --flatten --struct +lleq wp --struct | cvc5 --produce-models +``` + +Each mode uses a 120-second timeout and reports one of: + +- `verified` +- `counterexample` +- `partial` +- `timeout` +- `error` + +`verify` is classified as `partial` when any signal remains marked with `*`. +`wp` is classified as `partial` when cvc5 returns `unknown`. diff --git a/examples/circom-demo/ReLU_test.llzk b/examples/circom-demo/ReLU_test.llzk new file mode 100644 index 0000000..e6aa3de --- /dev/null +++ b/examples/circom-demo/ReLU_test.llzk @@ -0,0 +1,1140 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@relu_test_6::@relu_test_6<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_2 { + struct.def @CompConstant_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_340282366920938463463374607431768211455, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg4, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %39, %41, %38, %40 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#2 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_1::@Num2Bits_1::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %20 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_340282366920938463463374607431768211455, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg4, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg5, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %39, %41, %40, %38 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%11, %17) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_340282366920938463463374607431768211455, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg2, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg5, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg4, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %29, %31, %28, %30 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#2 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_1, %arg6 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg3, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg6, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %31, %33, %32, %30 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%3, %9) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sign_3 { + struct.def @Sign_3 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %11 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @CompConstant_2::@CompConstant_2::@product(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> + %24 = function.call @CompConstant_2::@CompConstant_2::@compute(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %4 : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %5 : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_2::@CompConstant_2::@constrain(%1, %7) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Sign_3::@Sign_3<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @CompConstant_2::@CompConstant_2::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %1 : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %2 : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sign_3::@Sign_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_3::@Sign_3<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@Sign_3::@Sign_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_3::@Sign_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_2::@CompConstant_2::@constrain(%1, %4) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsPositive_4 { + struct.def @IsPositive_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sign : !struct.type<@Sign_3::@Sign_3<[]>> + struct.member @sign$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @num2Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @num2Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %18 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_0::@Num2Bits_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %20 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = struct.readm %self[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %self[@sign] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@sign$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@num2Bits] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@num2Bits$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %23 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %26 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %35 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %36 = function.call @Sign_3::@Sign_3::@product(%35) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> + %37 = function.call @Sign_3::@Sign_3::@compute(%35) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %36 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %6[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %5[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %10 = struct.readm %9[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.sub %felt_const_1, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_0 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %12 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_2 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %13 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %14 = struct.readm %4[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %5[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_3::@Sign_3::@constrain(%4, %16) : (!struct.type<@Sign_3::@Sign_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%6, %17) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsPositive_4::@IsPositive_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %13 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %18 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @Sign_3::@Sign_3::@compute(%18) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + %4 = struct.readm %3[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_0 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_3::@Sign_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %6 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_2 : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %7 : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsPositive_4::@IsPositive_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sign] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Sign_3::@Sign_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sign$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2Bits] : <@IsPositive_4::@IsPositive_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2Bits$inputs] : <@IsPositive_4::@IsPositive_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %1[@sign] : <@Sign_3::@Sign_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_3::@Sign_3::@constrain(%1, %8) : (!struct.type<@Sign_3::@Sign_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %9) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ReLU_5 { + struct.def @ReLU_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isPositive : !struct.type<@IsPositive_4::@IsPositive_4<[]>> + struct.member @isPositive$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@ReLU_5::@ReLU_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %14 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = function.call @IsPositive_4::@IsPositive_4::@product(%14) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> + %16 = function.call @IsPositive_4::@IsPositive_4::@compute(%14) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %arg0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isPositive$inputs] = %pod_0 : <@ReLU_5::@ReLU_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + struct.writem %self[@isPositive] = %6 : <@ReLU_5::@ReLU_5<[]>>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %7 = struct.readm %self[@out] : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %self[@isPositive] : <@ReLU_5::@ReLU_5<[]>>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@isPositive$inputs] : <@ReLU_5::@ReLU_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %10 = pod.read %9[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %8[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %arg0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %9[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsPositive_4::@IsPositive_4::@constrain(%8, %13) : (!struct.type<@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@ReLU_5::@ReLU_5<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@ReLU_5::@ReLU_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %7 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = function.call @IsPositive_4::@IsPositive_4::@compute(%7) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %8 : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %arg0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isPositive$inputs] = %pod_0 : <@ReLU_5::@ReLU_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_4::@IsPositive_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + struct.writem %self[@isPositive] = %6 : <@ReLU_5::@ReLU_5<[]>>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ReLU_5::@ReLU_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ReLU_5::@ReLU_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %0 = struct.readm %arg0[@out] : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isPositive] : <@ReLU_5::@ReLU_5<[]>>, !struct.type<@IsPositive_4::@IsPositive_4<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isPositive$inputs] : <@ReLU_5::@ReLU_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %1[@out] : <@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsPositive_4::@IsPositive_4::@constrain(%1, %6) : (!struct.type<@IsPositive_4::@IsPositive_4<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @relu_test_6 { + struct.def @relu_test_6 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @relu : !array.type<3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> + struct.member @relu$inputs : !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@relu_test_6::@relu_test_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@relu_test_6::@relu_test_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %3 : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %array_0[%6] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %7[@in] = %5 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%8] = %7 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %array[%9] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %19 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = function.call @ReLU_5::@ReLU_5::@product(%19) : (!felt.type<"babybear">) -> !struct.type<@ReLU_5::@ReLU_5<[]>> + %21 = function.call @ReLU_5::@ReLU_5::@compute(%19) : (!felt.type<"babybear">) -> !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + pod.write %10[@comp] = %20 : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%22] = %10 : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %14 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array[%14] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%18] = %17 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu$inputs] = %array_0 : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %4 : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu] = %array_1 : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@relu] : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@relu$inputs] : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg0[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %2[%6] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%9] : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "constrain"} + %11 = struct.readm %10[@out] : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1] : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_5::@ReLU_5::@constrain(%3, %5) : (!struct.type<@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@relu_test_6::@relu_test_6<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@relu_test_6::@relu_test_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@relu_test_6::@relu_test_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %0 : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %array_0[%3] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %4[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%5] = %4 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %array[%6] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %16 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %17 = function.call @ReLU_5::@ReLU_5::@compute(%16) : (!felt.type<"babybear">) -> !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + pod.write %7[@comp] = %17 : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + %18 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%18] = %7 : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %11 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%11] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu$inputs] = %array_0 : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@ReLU_5::@ReLU_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %1 : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu] = %array_1 : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@relu_test_6::@relu_test_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@relu_test_6::@relu_test_6<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %0 = struct.readm %arg0[@out] : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@relu] : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !struct.type<@ReLU_5::@ReLU_5<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@relu$inputs] : <@relu_test_6::@relu_test_6<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %2[%6] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%9] : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "constrain"} + %11 = struct.readm %10[@out] : <@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2] : <3 x !struct.type<@ReLU_5::@ReLU_5<[]>>>, !struct.type<@ReLU_5::@ReLU_5<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_5::@ReLU_5::@constrain(%3, %5) : (!struct.type<@ReLU_5::@ReLU_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/SumPooling2D_stride_test.llzk b/examples/circom-demo/SumPooling2D_stride_test.llzk new file mode 100644 index 0000000..9c874ec --- /dev/null +++ b/examples/circom-demo/SumPooling2D_stride_test.llzk @@ -0,0 +1,474 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>} { + poly.template @matElemSum_0 { + struct.def @matElemSum_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @SumPooling2D_1 { + struct.def @SumPooling2D_1 { + struct.member @out : !array.type<3,3,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> + struct.member @elemSum$inputs : !array.type<3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %24 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%32, %33, %34] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %29 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38] = %35 : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%39, %40, %41] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %35[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @matElemSum_0::@matElemSum_0::@product(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> + %48 = function.call @matElemSum_0::@matElemSum_0::@compute(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %42[@comp] = %47 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %42 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @compute(%arg0: !array.type<10,10,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%29, %30, %31] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %34, %35] = %32 : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%36, %37, %38] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @matElemSum_0::@matElemSum_0::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%45, %46, %47] = %39 : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <3,3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, %arg1: !array.type<10,10,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <10,10,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <3,3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <3,3,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <3,3,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/SumPooling2D_test.llzk b/examples/circom-demo/SumPooling2D_test.llzk new file mode 100644 index 0000000..f4e8a63 --- /dev/null +++ b/examples/circom-demo/SumPooling2D_test.llzk @@ -0,0 +1,474 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>} { + poly.template @matElemSum_0 { + struct.def @matElemSum_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @SumPooling2D_1 { + struct.def @SumPooling2D_1 { + struct.member @out : !array.type<2,2,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> + struct.member @elemSum$inputs : !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %24 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%32, %33, %34] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %29 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38] = %35 : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%39, %40, %41] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %35[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @matElemSum_0::@matElemSum_0::@product(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> + %48 = function.call @matElemSum_0::@matElemSum_0::@compute(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %42[@comp] = %47 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %42 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @compute(%arg0: !array.type<5,5,3 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@SumPooling2D_1::@SumPooling2D_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%29, %30, %31] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %34, %35] = %32 : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%36, %37, %38] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @matElemSum_0::@matElemSum_0::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%45, %46, %47] = %39 : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <2,2,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_1::@SumPooling2D_1<[]>>, %arg1: !array.type<5,5,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_1::@SumPooling2D_1<[]>>, !array.type<2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <5,5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <2,2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <2,2,3 x !struct.type<@matElemSum_0::@matElemSum_0<[]>>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <2,2,3 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%3, %5) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/aes_256_ctr_test.llzk b/examples/circom-demo/aes_256_ctr_test.llzk new file mode 100644 index 0000000..55e5bdf --- /dev/null +++ b/examples/circom-demo/aes_256_ctr_test.llzk @@ -0,0 +1,8465 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@AES256CTR_8::@AES256CTR_8<[]>>} { + function.def @emulated_aesenc_rijndael_sbox_0(%arg0: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c255 = arith.constant 255 : index + %c254 = arith.constant 254 : index + %c253 = arith.constant 253 : index + %c252 = arith.constant 252 : index + %c251 = arith.constant 251 : index + %c250 = arith.constant 250 : index + %c249 = arith.constant 249 : index + %c248 = arith.constant 248 : index + %c247 = arith.constant 247 : index + %c246 = arith.constant 246 : index + %c245 = arith.constant 245 : index + %c244 = arith.constant 244 : index + %c243 = arith.constant 243 : index + %c242 = arith.constant 242 : index + %c241 = arith.constant 241 : index + %c240 = arith.constant 240 : index + %c239 = arith.constant 239 : index + %c238 = arith.constant 238 : index + %c237 = arith.constant 237 : index + %c236 = arith.constant 236 : index + %c235 = arith.constant 235 : index + %c234 = arith.constant 234 : index + %c233 = arith.constant 233 : index + %c232 = arith.constant 232 : index + %c231 = arith.constant 231 : index + %c230 = arith.constant 230 : index + %c229 = arith.constant 229 : index + %c228 = arith.constant 228 : index + %c227 = arith.constant 227 : index + %c226 = arith.constant 226 : index + %c225 = arith.constant 225 : index + %c224 = arith.constant 224 : index + %c223 = arith.constant 223 : index + %c222 = arith.constant 222 : index + %c221 = arith.constant 221 : index + %c220 = arith.constant 220 : index + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_255 = felt.const 255 : <"babybear"> + %felt_const_254 = felt.const 254 : <"babybear"> + %felt_const_253 = felt.const 253 : <"babybear"> + %felt_const_252 = felt.const 252 : <"babybear"> + %felt_const_251 = felt.const 251 : <"babybear"> + %felt_const_250 = felt.const 250 : <"babybear"> + %felt_const_249 = felt.const 249 : <"babybear"> + %felt_const_248 = felt.const 248 : <"babybear"> + %felt_const_247 = felt.const 247 : <"babybear"> + %felt_const_246 = felt.const 246 : <"babybear"> + %felt_const_245 = felt.const 245 : <"babybear"> + %felt_const_244 = felt.const 244 : <"babybear"> + %felt_const_243 = felt.const 243 : <"babybear"> + %felt_const_242 = felt.const 242 : <"babybear"> + %felt_const_241 = felt.const 241 : <"babybear"> + %felt_const_240 = felt.const 240 : <"babybear"> + %felt_const_239 = felt.const 239 : <"babybear"> + %felt_const_238 = felt.const 238 : <"babybear"> + %felt_const_237 = felt.const 237 : <"babybear"> + %felt_const_236 = felt.const 236 : <"babybear"> + %felt_const_235 = felt.const 235 : <"babybear"> + %felt_const_234 = felt.const 234 : <"babybear"> + %felt_const_233 = felt.const 233 : <"babybear"> + %felt_const_232 = felt.const 232 : <"babybear"> + %felt_const_231 = felt.const 231 : <"babybear"> + %felt_const_230 = felt.const 230 : <"babybear"> + %felt_const_229 = felt.const 229 : <"babybear"> + %felt_const_228 = felt.const 228 : <"babybear"> + %felt_const_227 = felt.const 227 : <"babybear"> + %felt_const_226 = felt.const 226 : <"babybear"> + %felt_const_225 = felt.const 225 : <"babybear"> + %felt_const_224 = felt.const 224 : <"babybear"> + %felt_const_223 = felt.const 223 : <"babybear"> + %felt_const_222 = felt.const 222 : <"babybear"> + %felt_const_221 = felt.const 221 : <"babybear"> + %felt_const_220 = felt.const 220 : <"babybear"> + %felt_const_219 = felt.const 219 : <"babybear"> + %felt_const_218 = felt.const 218 : <"babybear"> + %felt_const_217 = felt.const 217 : <"babybear"> + %felt_const_216 = felt.const 216 : <"babybear"> + %felt_const_215 = felt.const 215 : <"babybear"> + %felt_const_214 = felt.const 214 : <"babybear"> + %felt_const_213 = felt.const 213 : <"babybear"> + %felt_const_212 = felt.const 212 : <"babybear"> + %felt_const_211 = felt.const 211 : <"babybear"> + %felt_const_210 = felt.const 210 : <"babybear"> + %felt_const_209 = felt.const 209 : <"babybear"> + %felt_const_208 = felt.const 208 : <"babybear"> + %felt_const_207 = felt.const 207 : <"babybear"> + %felt_const_206 = felt.const 206 : <"babybear"> + %felt_const_205 = felt.const 205 : <"babybear"> + %felt_const_204 = felt.const 204 : <"babybear"> + %felt_const_203 = felt.const 203 : <"babybear"> + %felt_const_202 = felt.const 202 : <"babybear"> + %felt_const_201 = felt.const 201 : <"babybear"> + %felt_const_200 = felt.const 200 : <"babybear"> + %felt_const_199 = felt.const 199 : <"babybear"> + %felt_const_198 = felt.const 198 : <"babybear"> + %felt_const_197 = felt.const 197 : <"babybear"> + %felt_const_196 = felt.const 196 : <"babybear"> + %felt_const_195 = felt.const 195 : <"babybear"> + %felt_const_194 = felt.const 194 : <"babybear"> + %felt_const_193 = felt.const 193 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_191 = felt.const 191 : <"babybear"> + %felt_const_190 = felt.const 190 : <"babybear"> + %felt_const_189 = felt.const 189 : <"babybear"> + %felt_const_188 = felt.const 188 : <"babybear"> + %felt_const_187 = felt.const 187 : <"babybear"> + %felt_const_186 = felt.const 186 : <"babybear"> + %felt_const_185 = felt.const 185 : <"babybear"> + %felt_const_184 = felt.const 184 : <"babybear"> + %felt_const_183 = felt.const 183 : <"babybear"> + %felt_const_182 = felt.const 182 : <"babybear"> + %felt_const_181 = felt.const 181 : <"babybear"> + %felt_const_180 = felt.const 180 : <"babybear"> + %felt_const_179 = felt.const 179 : <"babybear"> + %felt_const_178 = felt.const 178 : <"babybear"> + %felt_const_177 = felt.const 177 : <"babybear"> + %felt_const_176 = felt.const 176 : <"babybear"> + %felt_const_175 = felt.const 175 : <"babybear"> + %felt_const_174 = felt.const 174 : <"babybear"> + %felt_const_173 = felt.const 173 : <"babybear"> + %felt_const_172 = felt.const 172 : <"babybear"> + %felt_const_171 = felt.const 171 : <"babybear"> + %felt_const_170 = felt.const 170 : <"babybear"> + %felt_const_169 = felt.const 169 : <"babybear"> + %felt_const_168 = felt.const 168 : <"babybear"> + %felt_const_167 = felt.const 167 : <"babybear"> + %felt_const_166 = felt.const 166 : <"babybear"> + %felt_const_165 = felt.const 165 : <"babybear"> + %felt_const_164 = felt.const 164 : <"babybear"> + %felt_const_163 = felt.const 163 : <"babybear"> + %felt_const_162 = felt.const 162 : <"babybear"> + %felt_const_161 = felt.const 161 : <"babybear"> + %felt_const_160 = felt.const 160 : <"babybear"> + %felt_const_159 = felt.const 159 : <"babybear"> + %felt_const_158 = felt.const 158 : <"babybear"> + %felt_const_157 = felt.const 157 : <"babybear"> + %felt_const_156 = felt.const 156 : <"babybear"> + %felt_const_155 = felt.const 155 : <"babybear"> + %felt_const_154 = felt.const 154 : <"babybear"> + %felt_const_153 = felt.const 153 : <"babybear"> + %felt_const_152 = felt.const 152 : <"babybear"> + %felt_const_151 = felt.const 151 : <"babybear"> + %felt_const_150 = felt.const 150 : <"babybear"> + %felt_const_149 = felt.const 149 : <"babybear"> + %felt_const_148 = felt.const 148 : <"babybear"> + %felt_const_147 = felt.const 147 : <"babybear"> + %felt_const_146 = felt.const 146 : <"babybear"> + %felt_const_145 = felt.const 145 : <"babybear"> + %felt_const_144 = felt.const 144 : <"babybear"> + %felt_const_143 = felt.const 143 : <"babybear"> + %felt_const_142 = felt.const 142 : <"babybear"> + %felt_const_141 = felt.const 141 : <"babybear"> + %felt_const_140 = felt.const 140 : <"babybear"> + %felt_const_139 = felt.const 139 : <"babybear"> + %felt_const_138 = felt.const 138 : <"babybear"> + %felt_const_137 = felt.const 137 : <"babybear"> + %felt_const_136 = felt.const 136 : <"babybear"> + %felt_const_135 = felt.const 135 : <"babybear"> + %felt_const_134 = felt.const 134 : <"babybear"> + %felt_const_133 = felt.const 133 : <"babybear"> + %felt_const_132 = felt.const 132 : <"babybear"> + %felt_const_131 = felt.const 131 : <"babybear"> + %felt_const_130 = felt.const 130 : <"babybear"> + %felt_const_129 = felt.const 129 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_127 = felt.const 127 : <"babybear"> + %felt_const_126 = felt.const 126 : <"babybear"> + %felt_const_125 = felt.const 125 : <"babybear"> + %felt_const_124 = felt.const 124 : <"babybear"> + %felt_const_123 = felt.const 123 : <"babybear"> + %felt_const_122 = felt.const 122 : <"babybear"> + %felt_const_121 = felt.const 121 : <"babybear"> + %felt_const_120 = felt.const 120 : <"babybear"> + %felt_const_119 = felt.const 119 : <"babybear"> + %felt_const_118 = felt.const 118 : <"babybear"> + %felt_const_117 = felt.const 117 : <"babybear"> + %felt_const_116 = felt.const 116 : <"babybear"> + %felt_const_115 = felt.const 115 : <"babybear"> + %felt_const_114 = felt.const 114 : <"babybear"> + %felt_const_113 = felt.const 113 : <"babybear"> + %felt_const_112 = felt.const 112 : <"babybear"> + %felt_const_111 = felt.const 111 : <"babybear"> + %felt_const_110 = felt.const 110 : <"babybear"> + %felt_const_109 = felt.const 109 : <"babybear"> + %felt_const_108 = felt.const 108 : <"babybear"> + %felt_const_107 = felt.const 107 : <"babybear"> + %felt_const_106 = felt.const 106 : <"babybear"> + %felt_const_105 = felt.const 105 : <"babybear"> + %felt_const_104 = felt.const 104 : <"babybear"> + %felt_const_103 = felt.const 103 : <"babybear"> + %felt_const_102 = felt.const 102 : <"babybear"> + %felt_const_101 = felt.const 101 : <"babybear"> + %felt_const_100 = felt.const 100 : <"babybear"> + %felt_const_99 = felt.const 99 : <"babybear"> + %felt_const_98 = felt.const 98 : <"babybear"> + %felt_const_97 = felt.const 97 : <"babybear"> + %felt_const_96 = felt.const 96 : <"babybear"> + %felt_const_95 = felt.const 95 : <"babybear"> + %felt_const_94 = felt.const 94 : <"babybear"> + %felt_const_93 = felt.const 93 : <"babybear"> + %felt_const_92 = felt.const 92 : <"babybear"> + %felt_const_91 = felt.const 91 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_89 = felt.const 89 : <"babybear"> + %felt_const_88 = felt.const 88 : <"babybear"> + %felt_const_87 = felt.const 87 : <"babybear"> + %felt_const_86 = felt.const 86 : <"babybear"> + %felt_const_85 = felt.const 85 : <"babybear"> + %felt_const_84 = felt.const 84 : <"babybear"> + %felt_const_83 = felt.const 83 : <"babybear"> + %felt_const_82 = felt.const 82 : <"babybear"> + %felt_const_81 = felt.const 81 : <"babybear"> + %felt_const_80 = felt.const 80 : <"babybear"> + %felt_const_79 = felt.const 79 : <"babybear"> + %felt_const_78 = felt.const 78 : <"babybear"> + %felt_const_77 = felt.const 77 : <"babybear"> + %felt_const_76 = felt.const 76 : <"babybear"> + %felt_const_75 = felt.const 75 : <"babybear"> + %felt_const_74 = felt.const 74 : <"babybear"> + %felt_const_73 = felt.const 73 : <"babybear"> + %felt_const_72 = felt.const 72 : <"babybear"> + %felt_const_71 = felt.const 71 : <"babybear"> + %felt_const_70 = felt.const 70 : <"babybear"> + %felt_const_69 = felt.const 69 : <"babybear"> + %felt_const_68 = felt.const 68 : <"babybear"> + %felt_const_67 = felt.const 67 : <"babybear"> + %felt_const_66 = felt.const 66 : <"babybear"> + %felt_const_65 = felt.const 65 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_60 = felt.const 60 : <"babybear"> + %felt_const_59 = felt.const 59 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_57 = felt.const 57 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_53 = felt.const 53 : <"babybear"> + %felt_const_52 = felt.const 52 : <"babybear"> + %felt_const_51 = felt.const 51 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_48 = felt.const 48 : <"babybear"> + %felt_const_47 = felt.const 47 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_42 = felt.const 42 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %felt_const_40 = felt.const 40 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_38 = felt.const 38 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_35 = felt.const 35 : <"babybear"> + %felt_const_34 = felt.const 34 : <"babybear"> + %felt_const_33 = felt.const 33 : <"babybear"> + %felt_const_32 = felt.const 32 : <"babybear"> + %felt_const_31 = felt.const 31 : <"babybear"> + %felt_const_30 = felt.const 30 : <"babybear"> + %felt_const_29 = felt.const 29 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %felt_const_26 = felt.const 26 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_24 = felt.const 24 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_22 = felt.const 22 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %felt_const_17 = felt.const 17 : <"babybear"> + %felt_const_16 = felt.const 16 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %felt_const_13 = felt.const 13 : <"babybear"> + %felt_const_12 = felt.const 12 : <"babybear"> + %felt_const_11 = felt.const 11 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %felt_const_5 = felt.const 5 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c218] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c219] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c220] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c221] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c222] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c223] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c224] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c225] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c226] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c227] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c228] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c229] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c230] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c231] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c232] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c233] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c234] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c235] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c236] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c237] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c238] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c239] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c240] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c241] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c242] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c243] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c244] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c245] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c246] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c247] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c248] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c249] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c250] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c251] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c252] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c253] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c255] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_99 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_124 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_119 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_123 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_242 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_107 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_111 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_197 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_48 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_1 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_103 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_43 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_254 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_215 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_171 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_118 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_202 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_130 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_201 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_125 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_250 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_89 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_71 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_240 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_173 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_212 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_162 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_175 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_156 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_164 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_114 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_192 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_183 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_253 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_147 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_38 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_54 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_63 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_247 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_204 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_52 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_165 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_229 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_241 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_113 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_216 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_49 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_21 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_199 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_35 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_195 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_24 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_150 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_5 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_154 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_7 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_18 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_128 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_226 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_235 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_39 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_178 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_117 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_9 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_131 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_44 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_26 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_27 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_110 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_90 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_160 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_82 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_59 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_214 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_179 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_41 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_227 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_47 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_132 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_83 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_209 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_237 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_32 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_252 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_177 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_91 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_106 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_203 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_190 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_57 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_74 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_76 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_88 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_207 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_208 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_239 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_170 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_251 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_67 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_77 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_51 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_133 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_69 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_249 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_2 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_127 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_80 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_60 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_159 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_168 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_81 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_163 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_64 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_143 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_146 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_157 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_56 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_245 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_188 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_182 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_218 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_33 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_16 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_255 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_243 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_210 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_205 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_12 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_19 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_236 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_95 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_151 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_68 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_23 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_196 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_167 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_126 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_61 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_100 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_93 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_25 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_115 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_96 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_129 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_79 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_220 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_34 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_42 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_144 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_136 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_70 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_238 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_184 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_20 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_222 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_94 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_11 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_219 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_224 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_50 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_58 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_10 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_73 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_6 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_36 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_92 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_194 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_211 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_172 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_98 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_145 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_149 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_228 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_121 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_231 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_200 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_55 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_109 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_141 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_213 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_78 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_169 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_108 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_86 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_244 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_234 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_101 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_122 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_174 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_8 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_186 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_120 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_37 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_46 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_28 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_166 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_180 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_198 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_232 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_221 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_116 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_31 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_75 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_189 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_139 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_138 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_112 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_62 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_181 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_102 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_72 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_246 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_14 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_97 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_53 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c218] = %felt_const_87 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c219] = %felt_const_185 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c220] = %felt_const_134 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c221] = %felt_const_193 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c222] = %felt_const_29 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c223] = %felt_const_158 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c224] = %felt_const_225 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c225] = %felt_const_248 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c226] = %felt_const_152 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c227] = %felt_const_17 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c228] = %felt_const_105 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c229] = %felt_const_217 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c230] = %felt_const_142 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c231] = %felt_const_148 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c232] = %felt_const_155 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c233] = %felt_const_30 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c234] = %felt_const_135 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c235] = %felt_const_233 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c236] = %felt_const_206 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c237] = %felt_const_85 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c238] = %felt_const_40 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c239] = %felt_const_223 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c240] = %felt_const_140 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c241] = %felt_const_161 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c242] = %felt_const_137 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c243] = %felt_const_13 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c244] = %felt_const_191 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c245] = %felt_const_230 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c246] = %felt_const_66 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c247] = %felt_const_104 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c248] = %felt_const_65 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c249] = %felt_const_153 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c250] = %felt_const_45 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c251] = %felt_const_15 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c252] = %felt_const_176 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c253] = %felt_const_84 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c254] = %felt_const_187 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c255] = %felt_const_22 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg0 : !felt.type<"babybear"> + %1 = array.read %nondet[%0] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %1 : !felt.type<"babybear"> + } + function.def @emulated_aesenc_enc_table_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c255 = arith.constant 255 : index + %c254 = arith.constant 254 : index + %c253 = arith.constant 253 : index + %c252 = arith.constant 252 : index + %c251 = arith.constant 251 : index + %c250 = arith.constant 250 : index + %c249 = arith.constant 249 : index + %c248 = arith.constant 248 : index + %c247 = arith.constant 247 : index + %c246 = arith.constant 246 : index + %c245 = arith.constant 245 : index + %c244 = arith.constant 244 : index + %c243 = arith.constant 243 : index + %c242 = arith.constant 242 : index + %c241 = arith.constant 241 : index + %c240 = arith.constant 240 : index + %c239 = arith.constant 239 : index + %c238 = arith.constant 238 : index + %c237 = arith.constant 237 : index + %c236 = arith.constant 236 : index + %c235 = arith.constant 235 : index + %c234 = arith.constant 234 : index + %c233 = arith.constant 233 : index + %c232 = arith.constant 232 : index + %c231 = arith.constant 231 : index + %c230 = arith.constant 230 : index + %c229 = arith.constant 229 : index + %c228 = arith.constant 228 : index + %c227 = arith.constant 227 : index + %c226 = arith.constant 226 : index + %c225 = arith.constant 225 : index + %c224 = arith.constant 224 : index + %c223 = arith.constant 223 : index + %c222 = arith.constant 222 : index + %c221 = arith.constant 221 : index + %c220 = arith.constant 220 : index + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_742004246 = felt.const 742004246 : <"babybear"> + %felt_const_1842789307 = felt.const 1842789307 : <"babybear"> + %felt_const_2835108948 = felt.const 2835108948 : <"babybear"> + %felt_const_2076946608 = felt.const 2076946608 : <"babybear"> + %felt_const_504434447 = felt.const 504434447 : <"babybear"> + %felt_const_1517759789 = felt.const 1517759789 : <"babybear"> + %felt_const_699439513 = felt.const 699439513 : <"babybear"> + %felt_const_2193834305 = felt.const 2193834305 : <"babybear"> + %felt_const_3501746280 = felt.const 3501746280 : <"babybear"> + %felt_const_2227585602 = felt.const 2227585602 : <"babybear"> + %felt_const_3610371814 = felt.const 3610371814 : <"babybear"> + %felt_const_1708834751 = felt.const 1708834751 : <"babybear"> + %felt_const_437718285 = felt.const 437718285 : <"babybear"> + %felt_const_159418761 = felt.const 159418761 : <"babybear"> + %felt_const_1509466529 = felt.const 1509466529 : <"babybear"> + %felt_const_59739276 = felt.const 59739276 : <"babybear"> + %felt_const_2776293343 = felt.const 2776293343 : <"babybear"> + %felt_const_1350051880 = felt.const 1350051880 : <"babybear"> + %felt_const_2868860245 = felt.const 2868860245 : <"babybear"> + %felt_const_2269761230 = felt.const 2269761230 : <"babybear"> + %felt_const_3374377449 = felt.const 3374377449 : <"babybear"> + %felt_const_361924487 = felt.const 361924487 : <"babybear"> + %felt_const_1008868894 = felt.const 1008868894 : <"babybear"> + %felt_const_766942107 = felt.const 766942107 : <"babybear"> + %felt_const_866620564 = felt.const 866620564 : <"babybear"> + %felt_const_126455438 = felt.const 126455438 : <"babybear"> + %felt_const_2842745305 = felt.const 2842745305 : <"babybear"> + %felt_const_3535497577 = felt.const 3535497577 : <"babybear"> + %felt_const_573772049 = felt.const 573772049 : <"babybear"> + %felt_const_733190296 = felt.const 733190296 : <"babybear"> + %felt_const_3943954680 = felt.const 3943954680 : <"babybear"> + %felt_const_3644383713 = felt.const 3644383713 : <"babybear"> + %felt_const_666476190 = felt.const 666476190 : <"babybear"> + %felt_const_975641885 = felt.const 975641885 : <"babybear"> + %felt_const_2572730817 = felt.const 2572730817 : <"babybear"> + %felt_const_395413126 = felt.const 395413126 : <"babybear"> + %felt_const_1775286713 = felt.const 1775286713 : <"babybear"> + %felt_const_2935576407 = felt.const 2935576407 : <"babybear"> + %felt_const_1784624437 = felt.const 1784624437 : <"babybear"> + %felt_const_3265487201 = felt.const 3265487201 : <"babybear"> + %felt_const_470945294 = felt.const 470945294 : <"babybear"> + %felt_const_4144101110 = felt.const 4144101110 : <"babybear"> + %felt_const_100991747 = felt.const 100991747 : <"babybear"> + %felt_const_2430093384 = felt.const 2430093384 : <"babybear"> + %felt_const_3433719398 = felt.const 3433719398 : <"babybear"> + %felt_const_1908716981 = felt.const 1908716981 : <"babybear"> + %felt_const_2084716094 = felt.const 2084716094 : <"babybear"> + %felt_const_3767562352 = felt.const 3767562352 : <"babybear"> + %felt_const_260409994 = felt.const 260409994 : <"babybear"> + %felt_const_226921355 = felt.const 226921355 : <"babybear"> + %felt_const_1641856445 = felt.const 1641856445 : <"babybear"> + %felt_const_2531085131 = felt.const 2531085131 : <"babybear"> + %felt_const_1042358047 = felt.const 1042358047 : <"babybear"> + %felt_const_3902567540 = felt.const 3902567540 : <"babybear"> + %felt_const_2709315037 = felt.const 2709315037 : <"babybear"> + %felt_const_3408128232 = felt.const 3408128232 : <"babybear"> + %felt_const_2538718918 = felt.const 2538718918 : <"babybear"> + %felt_const_1942467764 = felt.const 1942467764 : <"babybear"> + %felt_const_1475454630 = felt.const 1475454630 : <"babybear"> + %felt_const_941890588 = felt.const 941890588 : <"babybear"> + %felt_const_1550986798 = felt.const 1550986798 : <"babybear"> + %felt_const_1248797989 = felt.const 1248797989 : <"babybear"> + %felt_const_4035475576 = felt.const 4035475576 : <"babybear"> + %felt_const_1876277946 = felt.const 1876277946 : <"babybear"> + %felt_const_270010376 = felt.const 270010376 : <"babybear"> + %felt_const_1206496942 = felt.const 1206496942 : <"babybear"> + %felt_const_4102978170 = felt.const 4102978170 : <"babybear"> + %felt_const_3400492389 = felt.const 3400492389 : <"babybear"> + %felt_const_3475368682 = felt.const 3475368682 : <"babybear"> + %felt_const_4077384948 = felt.const 4077384948 : <"babybear"> + %felt_const_2902087254 = felt.const 2902087254 : <"babybear"> + %felt_const_3635702892 = felt.const 3635702892 : <"babybear"> + %felt_const_1239460265 = felt.const 1239460265 : <"babybear"> + %felt_const_2631028302 = felt.const 2631028302 : <"babybear"> + %felt_const_2976175573 = felt.const 2976175573 : <"babybear"> + %felt_const_25988493 = felt.const 25988493 : <"babybear"> + %felt_const_3669454189 = felt.const 3669454189 : <"babybear"> + %felt_const_1851340599 = felt.const 1851340599 : <"babybear"> + %felt_const_2336475336 = felt.const 2336475336 : <"babybear"> + %felt_const_3576883175 = felt.const 3576883175 : <"babybear"> + %felt_const_4069226873 = felt.const 4069226873 : <"babybear"> + %felt_const_3543655652 = felt.const 3543655652 : <"babybear"> + %felt_const_832869781 = felt.const 832869781 : <"babybear"> + %felt_const_967348625 = felt.const 967348625 : <"babybear"> + %felt_const_3299238498 = felt.const 3299238498 : <"babybear"> + %felt_const_1139780780 = felt.const 1139780780 : <"babybear"> + %felt_const_3178157011 = felt.const 3178157011 : <"babybear"> + %felt_const_2673722050 = felt.const 2673722050 : <"babybear"> + %felt_const_3101973596 = felt.const 3101973596 : <"babybear"> + %felt_const_1215046692 = felt.const 1215046692 : <"babybear"> + %felt_const_201983494 = felt.const 201983494 : <"babybear"> + %felt_const_2463844681 = felt.const 2463844681 : <"babybear"> + %felt_const_337512970 = felt.const 337512970 : <"babybear"> + %felt_const_1951283770 = felt.const 1951283770 : <"babybear"> + %felt_const_1683370546 = felt.const 1683370546 : <"babybear"> + %felt_const_3678134496 = felt.const 3678134496 : <"babybear"> + %felt_const_2910247899 = felt.const 2910247899 : <"babybear"> + %felt_const_371002123 = felt.const 371002123 : <"babybear"> + %felt_const_3168951902 = felt.const 3168951902 : <"babybear"> + %felt_const_2809781982 = felt.const 2809781982 : <"babybear"> + %felt_const_675025940 = felt.const 675025940 : <"babybear"> + %felt_const_1809037496 = felt.const 1809037496 : <"babybear"> + %felt_const_3341414126 = felt.const 3341414126 : <"babybear"> + %felt_const_2362066502 = felt.const 2362066502 : <"babybear"> + %felt_const_193169544 = felt.const 193169544 : <"babybear"> + %felt_const_1001099408 = felt.const 1001099408 : <"babybear"> + %felt_const_1417554474 = felt.const 1417554474 : <"babybear"> + %felt_const_1147544098 = felt.const 1147544098 : <"babybear"> + %felt_const_2743065820 = felt.const 2743065820 : <"babybear"> + %felt_const_2664517455 = felt.const 2664517455 : <"babybear"> + %felt_const_429425025 = felt.const 429425025 : <"babybear"> + %felt_const_3231735904 = felt.const 3231735904 : <"babybear"> + %felt_const_3868554099 = felt.const 3868554099 : <"babybear"> + %felt_const_841685273 = felt.const 841685273 : <"babybear"> + %felt_const_3135724893 = felt.const 3135724893 : <"babybear"> + %felt_const_3366741092 = felt.const 3366741092 : <"babybear"> + %felt_const_2051489085 = felt.const 2051489085 : <"babybear"> + %felt_const_4236410494 = felt.const 4236410494 : <"babybear"> + %felt_const_1441965991 = felt.const 1441965991 : <"babybear"> + %felt_const_2472002756 = felt.const 2472002756 : <"babybear"> + %felt_const_775493399 = felt.const 775493399 : <"babybear"> + %felt_const_2295088196 = felt.const 2295088196 : <"babybear"> + %felt_const_899848087 = felt.const 899848087 : <"babybear"> + %felt_const_3202441055 = felt.const 3202441055 : <"babybear"> + %felt_const_3274697964 = felt.const 3274697964 : <"babybear"> + %felt_const_641012499 = felt.const 641012499 : <"babybear"> + %felt_const_403966988 = felt.const 403966988 : <"babybear"> + %felt_const_2169294285 = felt.const 2169294285 : <"babybear"> + %felt_const_3211645650 = felt.const 3211645650 : <"babybear"> + %felt_const_4245615603 = felt.const 4245615603 : <"babybear"> + %felt_const_3843751935 = felt.const 3843751935 : <"babybear"> + %felt_const_540020752 = felt.const 540020752 : <"babybear"> + %felt_const_1113792801 = felt.const 1113792801 : <"babybear"> + %felt_const_2943736538 = felt.const 2943736538 : <"babybear"> + %felt_const_2009183926 = felt.const 2009183926 : <"babybear"> + %felt_const_1675607228 = felt.const 1675607228 : <"babybear"> + %felt_const_4043634165 = felt.const 4043634165 : <"babybear"> + %felt_const_1883781176 = felt.const 1883781176 : <"babybear"> + %felt_const_566009245 = felt.const 566009245 : <"babybear"> + %felt_const_1068339858 = felt.const 1068339858 : <"babybear"> + %felt_const_92966799 = felt.const 92966799 : <"babybear"> + %felt_const_2160083008 = felt.const 2160083008 : <"babybear"> + %felt_const_1576969123 = felt.const 1576969123 : <"babybear"> + %felt_const_2733855057 = felt.const 2733855057 : <"babybear"> + %felt_const_1273211048 = felt.const 1273211048 : <"babybear"> + %felt_const_632987551 = felt.const 632987551 : <"babybear"> + %felt_const_2017737788 = felt.const 2017737788 : <"babybear"> + %felt_const_2700103760 = felt.const 2700103760 : <"babybear"> + %felt_const_4269899647 = felt.const 4269899647 : <"babybear"> + %felt_const_67502594 = felt.const 67502594 : <"babybear"> + %felt_const_3910203897 = felt.const 3910203897 : <"babybear"> + %felt_const_2328839493 = felt.const 2328839493 : <"babybear"> + %felt_const_294946181 = felt.const 294946181 : <"babybear"> + %felt_const_1716859699 = felt.const 1716859699 : <"babybear"> + %felt_const_2597801293 = felt.const 2597801293 : <"babybear"> + %felt_const_2261074755 = felt.const 2261074755 : <"babybear"> + %felt_const_3977706491 = felt.const 3977706491 : <"babybear"> + %felt_const_1340451498 = felt.const 1340451498 : <"babybear"> + %felt_const_3307925487 = felt.const 3307925487 : <"babybear"> + %felt_const_3144405200 = felt.const 3144405200 : <"babybear"> + %felt_const_2236272591 = felt.const 2236272591 : <"babybear"> + %felt_const_2968016984 = felt.const 2968016984 : <"babybear"> + %felt_const_2564049996 = felt.const 2564049996 : <"babybear"> + %felt_const_2497595978 = felt.const 2497595978 : <"babybear"> + %felt_const_1917532473 = felt.const 1917532473 : <"babybear"> + %felt_const_1742323390 = felt.const 1742323390 : <"babybear"> + %felt_const_2370227147 = felt.const 2370227147 : <"babybear"> + %felt_const_3569248874 = felt.const 3569248874 : <"babybear"> + %felt_const_3069008731 = felt.const 3069008731 : <"babybear"> + %felt_const_2043195825 = felt.const 2043195825 : <"babybear"> + %felt_const_3810524412 = felt.const 3810524412 : <"babybear"> + %felt_const_1080041504 = felt.const 1080041504 : <"babybear"> + %felt_const_3240947181 = felt.const 3240947181 : <"babybear"> + %felt_const_3110654417 = felt.const 3110654417 : <"babybear"> + %felt_const_2801095507 = felt.const 2801095507 : <"babybear"> + %felt_const_328696964 = felt.const 328696964 : <"babybear"> + %felt_const_1584475951 = felt.const 1584475951 : <"babybear"> + %felt_const_3711886307 = felt.const 3711886307 : <"babybear"> + %felt_const_1383803177 = felt.const 1383803177 : <"babybear"> + %felt_const_2110698419 = felt.const 2110698419 : <"babybear"> + %felt_const_3076642518 = felt.const 3076642518 : <"babybear"> + %felt_const_1984772923 = felt.const 1984772923 : <"babybear"> + %felt_const_2767606354 = felt.const 2767606354 : <"babybear"> + %felt_const_1543217312 = felt.const 1543217312 : <"babybear"> + %felt_const_3035519578 = felt.const 3035519578 : <"babybear"> + %felt_const_3702681198 = felt.const 3702681198 : <"babybear"> + %felt_const_908925723 = felt.const 908925723 : <"babybear"> + %felt_const_875436570 = felt.const 875436570 : <"babybear"> + %felt_const_1484008492 = felt.const 1484008492 : <"babybear"> + %felt_const_496927619 = felt.const 496927619 : <"babybear"> + %felt_const_303761673 = felt.const 303761673 : <"babybear"> + %felt_const_3936318837 = felt.const 3936318837 : <"babybear"> + %felt_const_2144187058 = felt.const 2144187058 : <"babybear"> + %felt_const_1315514151 = felt.const 1315514151 : <"babybear"> + %felt_const_3441880043 = felt.const 3441880043 : <"babybear"> + %felt_const_3745374946 = felt.const 3745374946 : <"babybear"> + %felt_const_463175808 = felt.const 463175808 : <"babybear"> + %felt_const_607523346 = felt.const 607523346 : <"babybear"> + %felt_const_235472647 = felt.const 235472647 : <"babybear"> + %felt_const_800430746 = felt.const 800430746 : <"babybear"> + %felt_const_168756485 = felt.const 168756485 : <"babybear"> + %felt_const_933336726 = felt.const 933336726 : <"babybear"> + %felt_const_807933976 = felt.const 807933976 : <"babybear"> + %felt_const_2640233411 = felt.const 2640233411 : <"babybear"> + %felt_const_1181033251 = felt.const 1181033251 : <"babybear"> + %felt_const_2505230279 = felt.const 2505230279 : <"babybear"> + %felt_const_135005188 = felt.const 135005188 : <"babybear"> + %felt_const_708777237 = felt.const 708777237 : <"babybear"> + %felt_const_1649619249 = felt.const 1649619249 : <"babybear"> + %felt_const_2876496088 = felt.const 2876496088 : <"babybear"> + %felt_const_3801313649 = felt.const 3801313649 : <"babybear"> + %felt_const_4178113009 = felt.const 4178113009 : <"babybear"> + %felt_const_3509904869 = felt.const 3509904869 : <"babybear"> + %felt_const_1374987685 = felt.const 1374987685 : <"babybear"> + %felt_const_1750873140 = felt.const 1750873140 : <"babybear"> + %felt_const_2203045068 = felt.const 2203045068 : <"babybear"> + %felt_const_4110612471 = felt.const 4110612471 : <"babybear"> + %felt_const_2118205247 = felt.const 2118205247 : <"babybear"> + %felt_const_1817851446 = felt.const 1817851446 : <"babybear"> + %felt_const_1282024998 = felt.const 1282024998 : <"babybear"> + %felt_const_1034851219 = felt.const 1034851219 : <"babybear"> + %felt_const_3776773629 = felt.const 3776773629 : <"babybear"> + %felt_const_1975695287 = felt.const 1975695287 : <"babybear"> + %felt_const_2606481600 = felt.const 2606481600 : <"babybear"> + %felt_const_3835064946 = felt.const 3835064946 : <"babybear"> + %felt_const_1408738468 = felt.const 1408738468 : <"babybear"> + %felt_const_599760028 = felt.const 599760028 : <"babybear"> + %felt_const_1173008303 = felt.const 1173008303 : <"babybear"> + %felt_const_1610457762 = felt.const 1610457762 : <"babybear"> + %felt_const_3009926356 = felt.const 3009926356 : <"babybear"> + %felt_const_1106029997 = felt.const 1106029997 : <"babybear"> + %felt_const_4211863792 = felt.const 4211863792 : <"babybear"> + %felt_const_2395555655 = felt.const 2395555655 : <"babybear"> + %felt_const_3001768281 = felt.const 3001768281 : <"babybear"> + %felt_const_4011195130 = felt.const 4011195130 : <"babybear"> + %felt_const_4203183485 = felt.const 4203183485 : <"babybear"> + %felt_const_2302724553 = felt.const 2302724553 : <"babybear"> + %felt_const_530416258 = felt.const 530416258 : <"babybear"> + %felt_const_2403715786 = felt.const 2403715786 : <"babybear"> + %felt_const_3969545846 = felt.const 3969545846 : <"babybear"> + %felt_const_1306962859 = felt.const 1306962859 : <"babybear"> + %felt_const_3043153879 = felt.const 3043153879 : <"babybear"> + %felt_const_3877240574 = felt.const 3877240574 : <"babybear"> + %felt_const_1451043627 = felt.const 1451043627 : <"babybear"> + %felt_const_3467208551 = felt.const 3467208551 : <"babybear"> + %felt_const_33751297 = felt.const 33751297 : <"babybear"> + %felt_const_1615867952 = felt.const 1615867952 : <"babybear"> + %felt_const_2438251973 = felt.const 2438251973 : <"babybear"> + %felt_const_3736170351 = felt.const 3736170351 : <"babybear"> + %felt_const_3602738027 = felt.const 3602738027 : <"babybear"> + %felt_const_4279104242 = felt.const 4279104242 : <"babybear"> + %felt_const_4136467323 = felt.const 4136467323 : <"babybear"> + %felt_const_4003034999 = felt.const 4003034999 : <"babybear"> + %felt_const_4169432188 = felt.const 4169432188 : <"babybear"> + %felt_const_3332727651 = felt.const 3332727651 : <"babybear"> + %felt_const_371997206 = felt.const 371997206 : <"babybear"> + %felt_const_3144537787 = felt.const 3144537787 : <"babybear"> + %felt_const_1420360788 = felt.const 1420360788 : <"babybear"> + %felt_const_2960903088 = felt.const 2960903088 : <"babybear"> + %felt_const_253628687 = felt.const 253628687 : <"babybear"> + %felt_const_760903469 = felt.const 760903469 : <"babybear"> + %felt_const_2569646233 = felt.const 2569646233 : <"babybear"> + %felt_const_1099088705 = felt.const 1099088705 : <"babybear"> + %felt_const_1758509160 = felt.const 1758509160 : <"babybear"> + %felt_const_1115997762 = felt.const 1115997762 : <"babybear"> + %felt_const_3872862694 = felt.const 3872862694 : <"babybear"> + %felt_const_3211123391 = felt.const 3211123391 : <"babybear"> + %felt_const_219813645 = felt.const 219813645 : <"babybear"> + %felt_const_2299101321 = felt.const 2299101321 : <"babybear"> + %felt_const_2707028129 = felt.const 2707028129 : <"babybear"> + %felt_const_2349043596 = felt.const 2349043596 : <"babybear"> + %felt_const_3752164063 = felt.const 3752164063 : <"babybear"> + %felt_const_676362280 = felt.const 676362280 : <"babybear"> + %felt_const_1437269845 = felt.const 1437269845 : <"babybear"> + %felt_const_3464972750 = felt.const 3464972750 : <"babybear"> + %felt_const_3922272489 = felt.const 3922272489 : <"babybear"> + %felt_const_2266337927 = felt.const 2266337927 : <"babybear"> + %felt_const_507257374 = felt.const 507257374 : <"babybear"> + %felt_const_2603464347 = felt.const 2603464347 : <"babybear"> + %felt_const_2486413204 = felt.const 2486413204 : <"babybear"> + %felt_const_2382858638 = felt.const 2382858638 : <"babybear"> + %felt_const_3651760345 = felt.const 3651760345 : <"babybear"> + %felt_const_1775418217 = felt.const 1775418217 : <"babybear"> + %felt_const_287453969 = felt.const 287453969 : <"babybear"> + %felt_const_2553000856 = felt.const 2553000856 : <"babybear"> + %felt_const_4176155640 = felt.const 4176155640 : <"babybear"> + %felt_const_3789109473 = felt.const 3789109473 : <"babybear"> + %felt_const_2653403550 = felt.const 2653403550 : <"babybear"> + %felt_const_490350365 = felt.const 490350365 : <"babybear"> + %felt_const_3248052417 = felt.const 3248052417 : <"babybear"> + %felt_const_2249691526 = felt.const 2249691526 : <"babybear"> + %felt_const_3110719673 = felt.const 3110719673 : <"babybear"> + %felt_const_1471084887 = felt.const 1471084887 : <"babybear"> + %felt_const_896163637 = felt.const 896163637 : <"babybear"> + %felt_const_1640145761 = felt.const 1640145761 : <"babybear"> + %felt_const_236720654 = felt.const 236720654 : <"babybear"> + %felt_const_4143383030 = felt.const 4143383030 : <"babybear"> + %felt_const_50726147 = felt.const 50726147 : <"babybear"> + %felt_const_1217452104 = felt.const 1217452104 : <"babybear"> + %felt_const_1724688998 = felt.const 1724688998 : <"babybear"> + %felt_const_3044132021 = felt.const 3044132021 : <"babybear"> + %felt_const_1048330814 = felt.const 1048330814 : <"babybear"> + %felt_const_1893765232 = felt.const 1893765232 : <"babybear"> + %felt_const_2316273034 = felt.const 2316273034 : <"babybear"> + %felt_const_2332919435 = felt.const 2332919435 : <"babybear"> + %felt_const_3177307325 = felt.const 3177307325 : <"babybear"> + %felt_const_1268178251 = felt.const 1268178251 : <"babybear"> + %felt_const_524165407 = felt.const 524165407 : <"babybear"> + %felt_const_1961401460 = felt.const 1961401460 : <"babybear"> + %felt_const_3718347997 = felt.const 3718347997 : <"babybear"> + %felt_const_3905627112 = felt.const 3905627112 : <"babybear"> + %felt_const_3331805638 = felt.const 3331805638 : <"babybear"> + %felt_const_3027486644 = felt.const 3027486644 : <"babybear"> + %felt_const_2790781350 = felt.const 2790781350 : <"babybear"> + %felt_const_473441308 = felt.const 473441308 : <"babybear"> + %felt_const_777810478 = felt.const 777810478 : <"babybear"> + %felt_const_625635109 = felt.const 625635109 : <"babybear"> + %felt_const_2029029496 = felt.const 2029029496 : <"babybear"> + %felt_const_3127891386 = felt.const 3127891386 : <"babybear"> + %felt_const_135272456 = felt.const 135272456 : <"babybear"> + %felt_const_2923948462 = felt.const 2923948462 : <"babybear"> + %felt_const_2062847610 = felt.const 2062847610 : <"babybear"> + %felt_const_1707781989 = felt.const 1707781989 : <"babybear"> + %felt_const_3939444202 = felt.const 3939444202 : <"babybear"> + %felt_const_4109567988 = felt.const 4109567988 : <"babybear"> + %felt_const_1454176854 = felt.const 1454176854 : <"babybear"> + %felt_const_1826141292 = felt.const 1826141292 : <"babybear"> + %felt_const_2840191145 = felt.const 2840191145 : <"babybear"> + %felt_const_1318900302 = felt.const 1318900302 : <"babybear"> + %felt_const_3585172693 = felt.const 3585172693 : <"babybear"> + %felt_const_2365688973 = felt.const 2365688973 : <"babybear"> + %felt_const_1843050349 = felt.const 1843050349 : <"babybear"> + %felt_const_929978679 = felt.const 929978679 : <"babybear"> + %felt_const_3364570056 = felt.const 3364570056 : <"babybear"> + %felt_const_3889509095 = felt.const 3889509095 : <"babybear"> + %felt_const_2045938553 = felt.const 2045938553 : <"babybear"> + %felt_const_3839047652 = felt.const 3839047652 : <"babybear"> + %felt_const_2503058581 = felt.const 2503058581 : <"babybear"> + %felt_const_2436475025 = felt.const 2436475025 : <"babybear"> + %felt_const_1657054818 = felt.const 1657054818 : <"babybear"> + %felt_const_2890133420 = felt.const 2890133420 : <"babybear"> + %felt_const_3552407251 = felt.const 3552407251 : <"babybear"> + %felt_const_3265224130 = felt.const 3265224130 : <"babybear"> + %felt_const_1555620956 = felt.const 1555620956 : <"babybear"> + %felt_const_608726052 = felt.const 608726052 : <"babybear"> + %felt_const_101452294 = felt.const 101452294 : <"babybear"> + %felt_const_1234361161 = felt.const 1234361161 : <"babybear"> + %felt_const_169090570 = felt.const 169090570 : <"babybear"> + %felt_const_980700730 = felt.const 980700730 : <"babybear"> + %felt_const_845436466 = felt.const 845436466 : <"babybear"> + %felt_const_3772464096 = felt.const 3772464096 : <"babybear"> + %felt_const_3685578459 = felt.const 3685578459 : <"babybear"> + %felt_const_185998603 = felt.const 185998603 : <"babybear"> + %felt_const_1589437022 = felt.const 1589437022 : <"babybear"> + %felt_const_3735517662 = felt.const 3735517662 : <"babybear"> + %felt_const_338181140 = felt.const 338181140 : <"babybear"> + %felt_const_3094074296 = felt.const 3094074296 : <"babybear"> + %felt_const_4006029806 = felt.const 4006029806 : <"babybear"> + %felt_const_1183631942 = felt.const 1183631942 : <"babybear"> + %felt_const_2282455944 = felt.const 2282455944 : <"babybear"> + %felt_const_2419829648 = felt.const 2419829648 : <"babybear"> + %felt_const_710180394 = felt.const 710180394 : <"babybear"> + %felt_const_574907938 = felt.const 574907938 : <"babybear"> + %felt_const_3701702620 = felt.const 3701702620 : <"babybear"> + %felt_const_1335808335 = felt.const 1335808335 : <"babybear"> + %felt_const_2165938305 = felt.const 2165938305 : <"babybear"> + %felt_const_1623236704 = felt.const 1623236704 : <"babybear"> + %felt_const_1944491379 = felt.const 1944491379 : <"babybear"> + %felt_const_422718233 = felt.const 422718233 : <"babybear"> + %felt_const_1572530013 = felt.const 1572530013 : <"babybear"> + %felt_const_1690872932 = felt.const 1690872932 : <"babybear"> + %felt_const_1031423805 = felt.const 1031423805 : <"babybear"> + %felt_const_2130477694 = felt.const 2130477694 : <"babybear"> + %felt_const_2807427751 = felt.const 2807427751 : <"babybear"> + %felt_const_3297990596 = felt.const 3297990596 : <"babybear"> + %felt_const_388905239 = felt.const 388905239 : <"babybear"> + %felt_const_1149815876 = felt.const 1149815876 : <"babybear"> + %felt_const_2536874647 = felt.const 2536874647 : <"babybear"> + %felt_const_1606345055 = felt.const 1606345055 : <"babybear"> + %felt_const_3972214764 = felt.const 3972214764 : <"babybear"> + %felt_const_321271059 = felt.const 321271059 : <"babybear"> + %felt_const_202904588 = felt.const 202904588 : <"babybear"> + %felt_const_3447803085 = felt.const 3447803085 : <"babybear"> + %felt_const_3535760850 = felt.const 3535760850 : <"babybear"> + %felt_const_4093447923 = felt.const 4093447923 : <"babybear"> + %felt_const_4293204735 = felt.const 4293204735 : <"babybear"> + %felt_const_270544912 = felt.const 270544912 : <"babybear"> + %felt_const_557998881 = felt.const 557998881 : <"babybear"> + %felt_const_3668932058 = felt.const 3668932058 : <"babybear"> + %felt_const_3061301686 = felt.const 3061301686 : <"babybear"> + %felt_const_3160661948 = felt.const 3160661948 : <"babybear"> + %felt_const_4126213365 = felt.const 4126213365 : <"babybear"> + %felt_const_946882616 = felt.const 946882616 : <"babybear"> + %felt_const_2636233885 = felt.const 2636233885 : <"babybear"> + %felt_const_2453646738 = felt.const 2453646738 : <"babybear"> + %felt_const_2399505039 = felt.const 2399505039 : <"babybear"> + %felt_const_1082179648 = felt.const 1082179648 : <"babybear"> + %felt_const_2740846243 = felt.const 2740846243 : <"babybear"> + %felt_const_1369633617 = felt.const 1369633617 : <"babybear"> + %felt_const_2823545768 = felt.const 2823545768 : <"babybear"> + %felt_const_2670049951 = felt.const 2670049951 : <"babybear"> + %felt_const_1014514748 = felt.const 1014514748 : <"babybear"> + %felt_const_1352724560 = felt.const 1352724560 : <"babybear"> + %felt_const_2147385727 = felt.const 2147385727 : <"babybear"> + %felt_const_33818114 = felt.const 33818114 : <"babybear"> + %felt_const_4192801017 = felt.const 4192801017 : <"babybear"> + %felt_const_1166724933 = felt.const 1166724933 : <"babybear"> + %felt_const_2232521861 = felt.const 2232521861 : <"babybear"> + %felt_const_862344499 = felt.const 862344499 : <"babybear"> + %felt_const_1301993293 = felt.const 1301993293 : <"babybear"> + %felt_const_1132905795 = felt.const 1132905795 : <"babybear"> + %felt_const_4226619131 = felt.const 4226619131 : <"babybear"> + %felt_const_2857362858 = felt.const 2857362858 : <"babybear"> + %felt_const_4022676207 = felt.const 4022676207 : <"babybear"> + %felt_const_3501943760 = felt.const 3501943760 : <"babybear"> + %felt_const_3481619151 = felt.const 3481619151 : <"babybear"> + %felt_const_1487988824 = felt.const 1487988824 : <"babybear"> + %felt_const_1285084236 = felt.const 1285084236 : <"babybear"> + %felt_const_1251270218 = felt.const 1251270218 : <"babybear"> + %felt_const_963791673 = felt.const 963791673 : <"babybear"> + %felt_const_3194476990 = felt.const 3194476990 : <"babybear"> + %felt_const_3415033547 = felt.const 3415033547 : <"babybear"> + %felt_const_1792327274 = felt.const 1792327274 : <"babybear"> + %felt_const_1538714971 = felt.const 1538714971 : <"babybear"> + %felt_const_2977548465 = felt.const 2977548465 : <"babybear"> + %felt_const_4242743292 = felt.const 4242743292 : <"babybear"> + %felt_const_541089824 = felt.const 541089824 : <"babybear"> + %felt_const_3988860141 = felt.const 3988860141 : <"babybear"> + %felt_const_3518589137 = felt.const 3518589137 : <"babybear"> + %felt_const_1403450707 = felt.const 1403450707 : <"babybear"> + %felt_const_2215876484 = felt.const 2215876484 : <"babybear"> + %felt_const_794718511 = felt.const 794718511 : <"babybear"> + %felt_const_3822927587 = felt.const 3822927587 : <"babybear"> + %felt_const_693271337 = felt.const 693271337 : <"babybear"> + %felt_const_3011366579 = felt.const 3011366579 : <"babybear"> + %felt_const_3602342358 = felt.const 3602342358 : <"babybear"> + %felt_const_997608763 = felt.const 997608763 : <"babybear"> + %felt_const_1386542674 = felt.const 1386542674 : <"babybear"> + %felt_const_2690382752 = felt.const 2690382752 : <"babybear"> + %felt_const_1521806938 = felt.const 1521806938 : <"babybear"> + %felt_const_1859957358 = felt.const 1859957358 : <"babybear"> + %felt_const_456535323 = felt.const 456535323 : <"babybear"> + %felt_const_439627290 = felt.const 439627290 : <"babybear"> + %felt_const_743994412 = felt.const 743994412 : <"babybear"> + %felt_const_2199756419 = felt.const 2199756419 : <"babybear"> + %felt_const_152181513 = felt.const 152181513 : <"babybear"> + %felt_const_1978310517 = felt.const 1978310517 : <"babybear"> + %felt_const_2994720178 = felt.const 2994720178 : <"babybear"> + %felt_const_659450151 = felt.const 659450151 : <"babybear"> + %felt_const_3956090603 = felt.const 3956090603 : <"babybear"> + %felt_const_3806281186 = felt.const 3806281186 : <"babybear"> + %felt_const_2149292928 = felt.const 2149292928 : <"babybear"> + %felt_const_304363026 = felt.const 304363026 : <"babybear"> + %felt_const_118360327 = felt.const 118360327 : <"babybear"> + %felt_const_2586817946 = felt.const 2586817946 : <"babybear"> + %felt_const_84545285 = felt.const 84545285 : <"babybear"> + %felt_const_2520228246 = felt.const 2520228246 : <"babybear"> + %felt_const_405809176 = felt.const 405809176 : <"babybear"> + %felt_const_3281870531 = felt.const 3281870531 : <"babybear"> + %felt_const_591815971 = felt.const 591815971 : <"babybear"> + %felt_const_3348452039 = felt.const 3348452039 : <"babybear"> + %felt_const_67636228 = felt.const 67636228 : <"babybear"> + %felt_const_355090197 = felt.const 355090197 : <"babybear"> + %felt_const_828527409 = felt.const 828527409 : <"babybear"> + %felt_const_3635114968 = felt.const 3635114968 : <"babybear"> + %felt_const_1910674289 = felt.const 1910674289 : <"babybear"> + %felt_const_4059629809 = felt.const 4059629809 : <"babybear"> + %felt_const_3855693029 = felt.const 3855693029 : <"babybear"> + %felt_const_2773611685 = felt.const 2773611685 : <"babybear"> + %felt_const_879254580 = felt.const 879254580 : <"babybear"> + %felt_const_3431157708 = felt.const 3431157708 : <"babybear"> + %felt_const_4160029431 = felt.const 4160029431 : <"babybear"> + %felt_const_1065238847 = felt.const 1065238847 : <"babybear"> + %felt_const_913070646 = felt.const 913070646 : <"babybear"> + %felt_const_642542118 = felt.const 642542118 : <"babybear"> + %felt_const_2470293139 = felt.const 2470293139 : <"babybear"> + %felt_const_4259388669 = felt.const 4259388669 : <"babybear"> + %felt_const_3077948087 = felt.const 3077948087 : <"babybear"> + %felt_const_3231407040 = felt.const 3231407040 : <"babybear"> + %felt_const_1927583346 = felt.const 1927583346 : <"babybear"> + %felt_const_2756966308 = felt.const 2756966308 : <"babybear"> + %felt_const_2619588508 = felt.const 2619588508 : <"babybear"> + %felt_const_2940594863 = felt.const 2940594863 : <"babybear"> + %felt_const_2724199842 = felt.const 2724199842 : <"babybear"> + %felt_const_3568527316 = felt.const 3568527316 : <"babybear"> + %felt_const_2906778797 = felt.const 2906778797 : <"babybear"> + %felt_const_4042984432 = felt.const 4042984432 : <"babybear"> + %felt_const_1200539975 = felt.const 1200539975 : <"babybear"> + %felt_const_1504897881 = felt.const 1504897881 : <"babybear"> + %felt_const_4209972730 = felt.const 4209972730 : <"babybear"> + %felt_const_2113570685 = felt.const 2113570685 : <"babybear"> + %felt_const_3381215433 = felt.const 3381215433 : <"babybear"> + %felt_const_2183110018 = felt.const 2183110018 : <"babybear"> + %felt_const_3398387146 = felt.const 3398387146 : <"babybear"> + %felt_const_1995217526 = felt.const 1995217526 : <"babybear"> + %felt_const_2874009259 = felt.const 2874009259 : <"babybear"> + %felt_const_3618988759 = felt.const 3618988759 : <"babybear"> + %felt_const_4276558334 = felt.const 4276558334 : <"babybear"> + %felt_const_727088427 = felt.const 727088427 : <"babybear"> + %felt_const_1741597031 = felt.const 1741597031 : <"babybear"> + %felt_const_16909057 = felt.const 16909057 : <"babybear"> + %felt_const_811618352 = felt.const 811618352 : <"babybear"> + %felt_const_3314635973 = felt.const 3314635973 : <"babybear"> + %felt_const_1876865391 = felt.const 1876865391 : <"babybear"> + %felt_const_1809235307 = felt.const 1809235307 : <"babybear"> + %felt_const_4076801522 = felt.const 4076801522 : <"babybear"> + %felt_const_2079755643 = felt.const 2079755643 : <"babybear"> + %felt_const_2012125559 = felt.const 2012125559 : <"babybear"> + %felt_const_2096661628 = felt.const 2096661628 : <"babybear"> + %felt_const_1673962851 = felt.const 1673962851 : <"babybear"> + %felt_const_370551866 = felt.const 370551866 : <"babybear"> + %felt_const_3149622742 = felt.const 3149622742 : <"babybear"> + %felt_const_1414834428 = felt.const 1414834428 : <"babybear"> + %felt_const_2964356043 = felt.const 2964356043 : <"babybear"> + %felt_const_252648977 = felt.const 252648977 : <"babybear"> + %felt_const_757946999 = felt.const 757946999 : <"babybear"> + %felt_const_2576951728 = felt.const 2576951728 : <"babybear"> + %felt_const_1094812355 = felt.const 1094812355 : <"babybear"> + %felt_const_1751699640 = felt.const 1751699640 : <"babybear"> + %felt_const_1111655622 = felt.const 1111655622 : <"babybear"> + %felt_const_3873888049 = felt.const 3873888049 : <"babybear"> + %felt_const_3216991706 = felt.const 3216991706 : <"babybear"> + %felt_const_218962455 = felt.const 218962455 : <"babybear"> + %felt_const_2307459456 = felt.const 2307459456 : <"babybear"> + %felt_const_2711706104 = felt.const 2711706104 : <"babybear"> + %felt_const_2357986191 = felt.const 2357986191 : <"babybear"> + %felt_const_3755976058 = felt.const 3755976058 : <"babybear"> + %felt_const_673730680 = felt.const 673730680 : <"babybear"> + %felt_const_1431677695 = felt.const 1431677695 : <"babybear"> + %felt_const_3469641545 = felt.const 3469641545 : <"babybear"> + %felt_const_3924412704 = felt.const 3924412704 : <"babybear"> + %felt_const_2273777042 = felt.const 2273777042 : <"babybear"> + %felt_const_505297954 = felt.const 505297954 : <"babybear"> + %felt_const_2610638262 = felt.const 2610638262 : <"babybear"> + %felt_const_2492740519 = felt.const 2492740519 : <"babybear"> + %felt_const_2391672713 = felt.const 2391672713 : <"babybear"> + %felt_const_3654920560 = felt.const 3654920560 : <"babybear"> + %felt_const_1768542907 = felt.const 1768542907 : <"babybear"> + %felt_const_286335539 = felt.const 286335539 : <"babybear"> + %felt_const_2560109491 = felt.const 2560109491 : <"babybear"> + %felt_const_4177062675 = felt.const 4177062675 : <"babybear"> + %felt_const_3789674808 = felt.const 3789674808 : <"babybear"> + %felt_const_2661164985 = felt.const 2661164985 : <"babybear"> + %felt_const_488454695 = felt.const 488454695 : <"babybear"> + %felt_const_3250690392 = felt.const 3250690392 : <"babybear"> + %felt_const_2256934801 = felt.const 2256934801 : <"babybear"> + %felt_const_3115936208 = felt.const 3115936208 : <"babybear"> + %felt_const_1465364217 = felt.const 1465364217 : <"babybear"> + %felt_const_892693087 = felt.const 892693087 : <"babybear"> + %felt_const_1633796771 = felt.const 1633796771 : <"babybear"> + %felt_const_235805714 = felt.const 235805714 : <"babybear"> + %felt_const_4143380225 = felt.const 4143380225 : <"babybear"> + %felt_const_50529797 = felt.const 50529797 : <"babybear"> + %felt_const_1212715224 = felt.const 1212715224 : <"babybear"> + %felt_const_1718013098 = felt.const 1718013098 : <"babybear"> + %felt_const_3048567236 = felt.const 3048567236 : <"babybear"> + %felt_const_1044282434 = felt.const 1044282434 : <"babybear"> + %felt_const_1886445712 = felt.const 1886445712 : <"babybear"> + %felt_const_2324303749 = felt.const 2324303749 : <"babybear"> + %felt_const_2341145990 = felt.const 2341145990 : <"babybear"> + %felt_const_3183305180 = felt.const 3183305180 : <"babybear"> + %felt_const_1263245021 = felt.const 1263245021 : <"babybear"> + %felt_const_522141217 = felt.const 522141217 : <"babybear"> + %felt_const_1953818780 = felt.const 1953818780 : <"babybear"> + %felt_const_3722289532 = felt.const 3722289532 : <"babybear"> + %felt_const_3907570467 = felt.const 3907570467 : <"babybear"> + %felt_const_3334903633 = felt.const 3334903633 : <"babybear"> + %felt_const_3031724999 = felt.const 3031724999 : <"babybear"> + %felt_const_2795919345 = felt.const 2795919345 : <"babybear"> + %felt_const_471611428 = felt.const 471611428 : <"babybear"> + %felt_const_774790258 = felt.const 774790258 : <"babybear"> + %felt_const_623200879 = felt.const 623200879 : <"babybear"> + %felt_const_2021191816 = felt.const 2021191816 : <"babybear"> + %felt_const_3132780501 = felt.const 3132780501 : <"babybear"> + %felt_const_134746136 = felt.const 134746136 : <"babybear"> + %felt_const_2930657257 = felt.const 2930657257 : <"babybear"> + %felt_const_2054878350 = felt.const 2054878350 : <"babybear"> + %felt_const_1701169839 = felt.const 1701169839 : <"babybear"> + %felt_const_3941256997 = felt.const 3941256997 : <"babybear"> + %felt_const_4109693703 = felt.const 4109693703 : <"babybear"> + %felt_const_1448520954 = felt.const 1448520954 : <"babybear"> + %felt_const_1819072692 = felt.const 1819072692 : <"babybear"> + %felt_const_2846444000 = felt.const 2846444000 : <"babybear"> + %felt_const_1313774802 = felt.const 1313774802 : <"babybear"> + %felt_const_3587551588 = felt.const 3587551588 : <"babybear"> + %felt_const_2374828428 = felt.const 2374828428 : <"babybear"> + %felt_const_1835915959 = felt.const 1835915959 : <"babybear"> + %felt_const_926379609 = felt.const 926379609 : <"babybear"> + %felt_const_3368586051 = felt.const 3368586051 : <"babybear"> + %felt_const_3890730290 = felt.const 3890730290 : <"babybear"> + %felt_const_2038035083 = felt.const 2038035083 : <"babybear"> + %felt_const_3840201527 = felt.const 3840201527 : <"babybear"> + %felt_const_2509582756 = felt.const 2509582756 : <"babybear"> + %felt_const_2442213800 = felt.const 2442213800 : <"babybear"> + %felt_const_1650640038 = felt.const 1650640038 : <"babybear"> + %felt_const_2896970735 = felt.const 2896970735 : <"babybear"> + %felt_const_3553869166 = felt.const 3553869166 : <"babybear"> + %felt_const_3267534685 = felt.const 3267534685 : <"babybear"> + %felt_const_1549580516 = felt.const 1549580516 : <"babybear"> + %felt_const_606357612 = felt.const 606357612 : <"babybear"> + %felt_const_101059594 = felt.const 101059594 : <"babybear"> + %felt_const_1229558491 = felt.const 1229558491 : <"babybear"> + %felt_const_168432670 = felt.const 168432670 : <"babybear"> + %felt_const_976909390 = felt.const 976909390 : <"babybear"> + %felt_const_842163286 = felt.const 842163286 : <"babybear"> + %felt_const_3772832571 = felt.const 3772832571 : <"babybear"> + %felt_const_3688607094 = felt.const 3688607094 : <"babybear"> + %felt_const_185275933 = felt.const 185275933 : <"babybear"> + %felt_const_1583267042 = felt.const 1583267042 : <"babybear"> + %felt_const_3739133817 = felt.const 3739133817 : <"babybear"> + %felt_const_336865340 = felt.const 336865340 : <"babybear"> + %felt_const_3099093971 = felt.const 3099093971 : <"babybear"> + %felt_const_4008625961 = felt.const 4008625961 : <"babybear"> + %felt_const_1179028682 = felt.const 1179028682 : <"babybear"> + %felt_const_2290617219 = felt.const 2290617219 : <"babybear"> + %felt_const_2425371563 = felt.const 2425371563 : <"babybear"> + %felt_const_707417214 = felt.const 707417214 : <"babybear"> + %felt_const_572671078 = felt.const 572671078 : <"babybear"> + %felt_const_3705447295 = felt.const 3705447295 : <"babybear"> + %felt_const_1330618065 = felt.const 1330618065 : <"babybear"> + %felt_const_2172721560 = felt.const 2172721560 : <"babybear"> + %felt_const_1616953504 = felt.const 1616953504 : <"babybear"> + %felt_const_1936975509 = felt.const 1936975509 : <"babybear"> + %felt_const_421081643 = felt.const 421081643 : <"babybear"> + %felt_const_1566423783 = felt.const 1566423783 : <"babybear"> + %felt_const_1684326572 = felt.const 1684326572 : <"babybear"> + %felt_const_1027439175 = felt.const 1027439175 : <"babybear"> + %felt_const_2122251394 = felt.const 2122251394 : <"babybear"> + %felt_const_2812761586 = felt.const 2812761586 : <"babybear"> + %felt_const_3301217111 = felt.const 3301217111 : <"babybear"> + %felt_const_387395129 = felt.const 387395129 : <"babybear"> + %felt_const_1145342156 = felt.const 1145342156 : <"babybear"> + %felt_const_2543269282 = felt.const 2543269282 : <"babybear"> + %felt_const_1600110305 = felt.const 1600110305 : <"babybear"> + %felt_const_3974939439 = felt.const 3974939439 : <"babybear"> + %felt_const_320022069 = felt.const 320022069 : <"babybear"> + %felt_const_202119188 = felt.const 202119188 : <"babybear"> + %felt_const_3452797260 = felt.const 3452797260 : <"babybear"> + %felt_const_3537026925 = felt.const 3537026925 : <"babybear"> + %felt_const_4092853518 = felt.const 4092853518 : <"babybear"> + %felt_const_4294960410 = felt.const 4294960410 : <"babybear"> + %felt_const_269492272 = felt.const 269492272 : <"babybear"> + %felt_const_555827811 = felt.const 555827811 : <"babybear"> + %felt_const_3671764853 = felt.const 3671764853 : <"babybear"> + %felt_const_3065411521 = felt.const 3065411521 : <"babybear"> + %felt_const_3166462943 = felt.const 3166462943 : <"babybear"> + %felt_const_4126535940 = felt.const 4126535940 : <"babybear"> + %felt_const_943222856 = felt.const 943222856 : <"babybear"> + %felt_const_2644320700 = felt.const 2644320700 : <"babybear"> + %felt_const_2459058093 = felt.const 2459058093 : <"babybear"> + %felt_const_2408514954 = felt.const 2408514954 : <"babybear"> + %felt_const_1077969088 = felt.const 1077969088 : <"babybear"> + %felt_const_2745392638 = felt.const 2745392638 : <"babybear"> + %felt_const_1364304627 = felt.const 1364304627 : <"babybear"> + %felt_const_2829601763 = felt.const 2829601763 : <"babybear"> + %felt_const_2678007226 = felt.const 2678007226 : <"babybear"> + %felt_const_1010595908 = felt.const 1010595908 : <"babybear"> + %felt_const_1347461360 = felt.const 1347461360 : <"babybear"> + %felt_const_2139094657 = felt.const 2139094657 : <"babybear"> + %felt_const_33686534 = felt.const 33686534 : <"babybear"> + %felt_const_4193904912 = felt.const 4193904912 : <"babybear"> + %felt_const_1162185423 = felt.const 1162185423 : <"babybear"> + %felt_const_2240090516 = felt.const 2240090516 : <"babybear"> + %felt_const_859006549 = felt.const 859006549 : <"babybear"> + %felt_const_1296931543 = felt.const 1296931543 : <"babybear"> + %felt_const_1128498885 = felt.const 1128498885 : <"babybear"> + %felt_const_4227591446 = felt.const 4227591446 : <"babybear"> + %felt_const_2863288293 = felt.const 2863288293 : <"babybear"> + %felt_const_4025468202 = felt.const 4025468202 : <"babybear"> + %felt_const_3503340395 = felt.const 3503340395 : <"babybear"> + %felt_const_3486483786 = felt.const 3486483786 : <"babybear"> + %felt_const_1482207464 = felt.const 1482207464 : <"babybear"> + %felt_const_1280088276 = felt.const 1280088276 : <"babybear"> + %felt_const_1246401758 = felt.const 1246401758 : <"babybear"> + %felt_const_960066123 = felt.const 960066123 : <"babybear"> + %felt_const_3200149465 = felt.const 3200149465 : <"babybear"> + %felt_const_3419114822 = felt.const 3419114822 : <"babybear"> + %felt_const_1785386174 = felt.const 1785386174 : <"babybear"> + %felt_const_1532737261 = felt.const 1532737261 : <"babybear"> + %felt_const_2981198280 = felt.const 2981198280 : <"babybear"> + %felt_const_4244431647 = felt.const 4244431647 : <"babybear"> + %felt_const_538984544 = felt.const 538984544 : <"babybear"> + %felt_const_3991781676 = felt.const 3991781676 : <"babybear"> + %felt_const_3520182632 = felt.const 3520182632 : <"babybear"> + %felt_const_1397991157 = felt.const 1397991157 : <"babybear"> + %felt_const_2223248279 = felt.const 2223248279 : <"babybear"> + %felt_const_791633521 = felt.const 791633521 : <"babybear"> + %felt_const_3823361342 = felt.const 3823361342 : <"babybear"> + %felt_const_690573947 = felt.const 690573947 : <"babybear"> + %felt_const_3014884814 = felt.const 3014884814 : <"babybear"> + %felt_const_3604395873 = felt.const 3604395873 : <"babybear"> + %felt_const_993752653 = felt.const 993752653 : <"babybear"> + %felt_const_1381147894 = felt.const 1381147894 : <"babybear"> + %felt_const_2694863867 = felt.const 2694863867 : <"babybear"> + %felt_const_1515893998 = felt.const 1515893998 : <"babybear"> + %felt_const_1852759218 = felt.const 1852759218 : <"babybear"> + %felt_const_454768173 = felt.const 454768173 : <"babybear"> + %felt_const_437924910 = felt.const 437924910 : <"babybear"> + %felt_const_741103732 = felt.const 741103732 : <"babybear"> + %felt_const_2206408094 = felt.const 2206408094 : <"babybear"> + %felt_const_151589403 = felt.const 151589403 : <"babybear"> + %felt_const_1970662047 = felt.const 1970662047 : <"babybear"> + %felt_const_2998042573 = felt.const 2998042573 : <"babybear"> + %felt_const_656887401 = felt.const 656887401 : <"babybear"> + %felt_const_3958099238 = felt.const 3958099238 : <"babybear"> + %felt_const_3806519101 = felt.const 3806519101 : <"babybear"> + %felt_const_2155879323 = felt.const 2155879323 : <"babybear"> + %felt_const_303178806 = felt.const 303178806 : <"babybear"> + %felt_const_117902857 = felt.const 117902857 : <"babybear"> + %felt_const_2593796021 = felt.const 2593796021 : <"babybear"> + %felt_const_84216335 = felt.const 84216335 : <"babybear"> + %felt_const_2526427041 = felt.const 2526427041 : <"babybear"> + %felt_const_404238376 = felt.const 404238376 : <"babybear"> + %felt_const_3284376926 = felt.const 3284376926 : <"babybear"> + %felt_const_589514341 = felt.const 589514341 : <"babybear"> + %felt_const_3351745874 = felt.const 3351745874 : <"babybear"> + %felt_const_67373068 = felt.const 67373068 : <"babybear"> + %felt_const_353708607 = felt.const 353708607 : <"babybear"> + %felt_const_825320019 = felt.const 825320019 : <"babybear"> + %felt_const_3638078323 = felt.const 3638078323 : <"babybear"> + %felt_const_1903288979 = felt.const 1903288979 : <"babybear"> + %felt_const_4059166984 = felt.const 4059166984 : <"babybear"> + %felt_const_3857043764 = felt.const 3857043764 : <"babybear"> + %felt_const_2779075060 = felt.const 2779075060 : <"babybear"> + %felt_const_875849820 = felt.const 875849820 : <"babybear"> + %felt_const_3435955023 = felt.const 3435955023 : <"babybear"> + %felt_const_4160222466 = felt.const 4160222466 : <"babybear"> + %felt_const_1061125697 = felt.const 1061125697 : <"babybear"> + %felt_const_909536346 = felt.const 909536346 : <"babybear"> + %felt_const_640044138 = felt.const 640044138 : <"babybear"> + %felt_const_2475900334 = felt.const 2475900334 : <"babybear"> + %felt_const_4261273884 = felt.const 4261273884 : <"babybear"> + %felt_const_3082253762 = felt.const 3082253762 : <"babybear"> + %felt_const_3233848155 = felt.const 3233848155 : <"babybear"> + %felt_const_1920132246 = felt.const 1920132246 : <"babybear"> + %felt_const_2762232823 = felt.const 2762232823 : <"babybear"> + %felt_const_2627478463 = felt.const 2627478463 : <"babybear"> + %felt_const_2947499498 = felt.const 2947499498 : <"babybear"> + %felt_const_2728550397 = felt.const 2728550397 : <"babybear"> + %felt_const_3570709351 = felt.const 3570709351 : <"babybear"> + %felt_const_2913812972 = felt.const 2913812972 : <"babybear"> + %felt_const_4042324747 = felt.const 4042324747 : <"babybear"> + %felt_const_1195871945 = felt.const 1195871945 : <"babybear"> + %felt_const_1499050731 = felt.const 1499050731 : <"babybear"> + %felt_const_4210749205 = felt.const 4210749205 : <"babybear"> + %felt_const_2105408135 = felt.const 2105408135 : <"babybear"> + %felt_const_3385428288 = felt.const 3385428288 : <"babybear"> + %felt_const_2189565853 = felt.const 2189565853 : <"babybear"> + %felt_const_3402272581 = felt.const 3402272581 : <"babybear"> + %felt_const_1987505306 = felt.const 1987505306 : <"babybear"> + %felt_const_2880130534 = felt.const 2880130534 : <"babybear"> + %felt_const_3621238114 = felt.const 3621238114 : <"babybear"> + %felt_const_4278118169 = felt.const 4278118169 : <"babybear"> + %felt_const_724260477 = felt.const 724260477 : <"babybear"> + %felt_const_1734856361 = felt.const 1734856361 : <"babybear"> + %felt_const_16843267 = felt.const 16843267 : <"babybear"> + %felt_const_808476752 = felt.const 808476752 : <"babybear"> + %felt_const_3318059348 = felt.const 3318059348 : <"babybear"> + %felt_const_1869602481 = felt.const 1869602481 : <"babybear"> + %felt_const_1802229437 = felt.const 1802229437 : <"babybear"> + %felt_const_4076011277 = felt.const 4076011277 : <"babybear"> + %felt_const_2071721613 = felt.const 2071721613 : <"babybear"> + %felt_const_2004348569 = felt.const 2004348569 : <"babybear"> + %felt_const_2088564868 = felt.const 2088564868 : <"babybear"> + %felt_const_1667483301 = felt.const 1667483301 : <"babybear"> + %felt_const_974525996 = felt.const 974525996 : <"babybear"> + %felt_const_3602627437 = felt.const 3602627437 : <"babybear"> + %felt_const_4233385128 = felt.const 4233385128 : <"babybear"> + %felt_const_3417354363 = felt.const 3417354363 : <"babybear"> + %felt_const_286199582 = felt.const 286199582 : <"babybear"> + %felt_const_1999449434 = felt.const 1999449434 : <"babybear"> + %felt_const_2962856233 = felt.const 2962856233 : <"babybear"> + %felt_const_3275833730 = felt.const 3275833730 : <"babybear"> + %felt_const_3093850320 = felt.const 3093850320 : <"babybear"> + %felt_const_3326231172 = felt.const 3326231172 : <"babybear"> + %felt_const_837215959 = felt.const 837215959 : <"babybear"> + %felt_const_3669999461 = felt.const 3669999461 : <"babybear"> + %felt_const_386731290 = felt.const 386731290 : <"babybear"> + %felt_const_2156497161 = felt.const 2156497161 : <"babybear"> + %felt_const_4171342169 = felt.const 4171342169 : <"babybear"> + %felt_const_2408352771 = felt.const 2408352771 : <"babybear"> + %felt_const_2061492133 = felt.const 2061492133 : <"babybear"> + %felt_const_2015897680 = felt.const 2015897680 : <"babybear"> + %felt_const_4283782570 = felt.const 4283782570 : <"babybear"> + %felt_const_1238290055 = felt.const 1238290055 : <"babybear"> + %felt_const_552200649 = felt.const 552200649 : <"babybear"> + %felt_const_2458355477 = felt.const 2458355477 : <"babybear"> + %felt_const_572399164 = felt.const 572399164 : <"babybear"> + %felt_const_3063651117 = felt.const 3063651117 : <"babybear"> + %felt_const_2811532339 = felt.const 2811532339 : <"babybear"> + %felt_const_2307821063 = felt.const 2307821063 : <"babybear"> + %felt_const_1893325225 = felt.const 1893325225 : <"babybear"> + %felt_const_3144247762 = felt.const 3144247762 : <"babybear"> + %felt_const_856756514 = felt.const 856756514 : <"babybear"> + %felt_const_3013122091 = felt.const 3013122091 : <"babybear"> + %felt_const_335083755 = felt.const 335083755 : <"babybear"> + %felt_const_954327513 = felt.const 954327513 : <"babybear"> + %felt_const_3114180135 = felt.const 3114180135 : <"babybear"> + %felt_const_656219450 = felt.const 656219450 : <"babybear"> + %felt_const_1489093017 = felt.const 1489093017 : <"babybear"> + %felt_const_2441512471 = felt.const 2441512471 : <"babybear"> + %felt_const_3501832553 = felt.const 3501832553 : <"babybear"> + %felt_const_4183250862 = felt.const 4183250862 : <"babybear"> + %felt_const_1597322602 = felt.const 1597322602 : <"babybear"> + %felt_const_2741068226 = felt.const 2741068226 : <"babybear"> + %felt_const_302911004 = felt.const 302911004 : <"babybear"> + %felt_const_32962295 = felt.const 32962295 : <"babybear"> + %felt_const_84083462 = felt.const 84083462 : <"babybear"> + %felt_const_3628615824 = felt.const 3628615824 : <"babybear"> + %felt_const_2858837708 = felt.const 2858837708 : <"babybear"> + %felt_const_3300242801 = felt.const 3300242801 : <"babybear"> + %felt_const_1111375484 = felt.const 1111375484 : <"babybear"> + %felt_const_2423288032 = felt.const 2423288032 : <"babybear"> + %felt_const_2240449039 = felt.const 2240449039 : <"babybear"> + %felt_const_2257292045 = felt.const 2257292045 : <"babybear"> + %felt_const_3703422305 = felt.const 3703422305 : <"babybear"> + %felt_const_3712699286 = felt.const 3712699286 : <"babybear"> + %felt_const_555687742 = felt.const 555687742 : <"babybear"> + %felt_const_2624877800 = felt.const 2624877800 : <"babybear"> + %felt_const_2094914977 = felt.const 2094914977 : <"babybear"> + %felt_const_602466507 = felt.const 602466507 : <"babybear"> + %felt_const_1371981463 = felt.const 1371981463 : <"babybear"> + %felt_const_3350508659 = felt.const 3350508659 : <"babybear"> + %felt_const_4054230615 = felt.const 4054230615 : <"babybear"> + %felt_const_605822008 = felt.const 605822008 : <"babybear"> + %felt_const_1915629148 = felt.const 1915629148 : <"babybear"> + %felt_const_1864705354 = felt.const 1864705354 : <"babybear"> + %felt_const_2289596656 = felt.const 2289596656 : <"babybear"> + %felt_const_3585784431 = felt.const 3585784431 : <"babybear"> + %felt_const_403179536 = felt.const 403179536 : <"babybear"> + %felt_const_3920539207 = felt.const 3920539207 : <"babybear"> + %felt_const_2390391540 = felt.const 2390391540 : <"babybear"> + %felt_const_2942657994 = felt.const 2942657994 : <"babybear"> + %felt_const_636152527 = felt.const 636152527 : <"babybear"> + %felt_const_133494003 = felt.const 133494003 : <"babybear"> + %felt_const_4199962284 = felt.const 4199962284 : <"babybear"> + %felt_const_3027004632 = felt.const 3027004632 : <"babybear"> + %felt_const_3769215305 = felt.const 3769215305 : <"babybear"> + %felt_const_3528347292 = felt.const 3528347292 : <"babybear"> + %felt_const_1691735473 = felt.const 1691735473 : <"babybear"> + %felt_const_2358086913 = felt.const 2358086913 : <"babybear"> + %felt_const_3077402074 = felt.const 3077402074 : <"babybear"> + %felt_const_1496790894 = felt.const 1496790894 : <"babybear"> + %felt_const_1137232011 = felt.const 1137232011 : <"babybear"> + %felt_const_854058965 = felt.const 854058965 : <"babybear"> + %felt_const_2339994098 = felt.const 2339994098 : <"babybear"> + %felt_const_937747667 = felt.const 937747667 : <"babybear"> + %felt_const_2761266481 = felt.const 2761266481 : <"babybear"> + %felt_const_2828112185 = felt.const 2828112185 : <"babybear"> + %felt_const_2791465668 = felt.const 2791465668 : <"babybear"> + %felt_const_4021070915 = felt.const 4021070915 : <"babybear"> + %felt_const_1859376061 = felt.const 1859376061 : <"babybear"> + %felt_const_1573044895 = felt.const 1573044895 : <"babybear"> + %felt_const_3831258296 = felt.const 3831258296 : <"babybear"> + %felt_const_1814307912 = felt.const 1814307912 : <"babybear"> + %felt_const_168166924 = felt.const 168166924 : <"babybear"> + %felt_const_3679013266 = felt.const 3679013266 : <"babybear"> + %felt_const_503974420 = felt.const 503974420 : <"babybear"> + %felt_const_1312438900 = felt.const 1312438900 : <"babybear"> + %felt_const_1446130276 = felt.const 1446130276 : <"babybear"> + %felt_const_1004593371 = felt.const 1004593371 : <"babybear"> + %felt_const_1994120109 = felt.const 1994120109 : <"babybear"> + %felt_const_487262998 = felt.const 487262998 : <"babybear"> + %felt_const_3797835452 = felt.const 3797835452 : <"babybear"> + %felt_const_2044649127 = felt.const 2044649127 : <"babybear"> + %felt_const_1007948840 = felt.const 1007948840 : <"babybear"> + %felt_const_3552098411 = felt.const 3552098411 : <"babybear"> + %felt_const_703524551 = felt.const 703524551 : <"babybear"> + %felt_const_3393603212 = felt.const 3393603212 : <"babybear"> + %felt_const_2206763019 = felt.const 2206763019 : <"babybear"> + %felt_const_2878378043 = felt.const 2878378043 : <"babybear"> + %felt_const_2116692564 = felt.const 2116692564 : <"babybear"> + %felt_const_1713513028 = felt.const 1713513028 : <"babybear"> + %felt_const_2145180835 = felt.const 2145180835 : <"babybear"> + %felt_const_3511635870 = felt.const 3511635870 : <"babybear"> + %felt_const_2558624025 = felt.const 2558624025 : <"babybear"> + %felt_const_2690670784 = felt.const 2690670784 : <"babybear"> + %felt_const_2507371494 = felt.const 2507371494 : <"babybear"> + %felt_const_723065138 = felt.const 723065138 : <"babybear"> + %felt_const_3881655738 = felt.const 3881655738 : <"babybear"> + %felt_const_2892260552 = felt.const 2892260552 : <"babybear"> + %felt_const_1195195770 = felt.const 1195195770 : <"babybear"> + %felt_const_2189328124 = felt.const 2189328124 : <"babybear"> + %felt_const_4071073621 = felt.const 4071073621 : <"babybear"> + %felt_const_1472513171 = felt.const 1472513171 : <"babybear"> + %felt_const_957814574 = felt.const 957814574 : <"babybear"> + %felt_const_3427026056 = felt.const 3427026056 : <"babybear"> + %felt_const_2727843637 = felt.const 2727843637 : <"babybear"> + %felt_const_3781124030 = felt.const 3781124030 : <"babybear"> + %felt_const_804056259 = felt.const 804056259 : <"babybear"> + %felt_const_890442534 = felt.const 890442534 : <"babybear"> + %felt_const_336333848 = felt.const 336333848 : <"babybear"> + %felt_const_1288555905 = felt.const 1288555905 : <"babybear"> + %felt_const_1842533055 = felt.const 1842533055 : <"babybear"> + %felt_const_250868733 = felt.const 250868733 : <"babybear"> + %felt_const_452984805 = felt.const 452984805 : <"babybear"> + %felt_const_806359072 = felt.const 806359072 : <"babybear"> + %felt_const_1663115586 = felt.const 1663115586 : <"babybear"> + %felt_const_1977277103 = felt.const 1977277103 : <"babybear"> + %felt_const_3249976951 = felt.const 3249976951 : <"babybear"> + %felt_const_3753688163 = felt.const 3753688163 : <"babybear"> + %felt_const_83228145 = felt.const 83228145 : <"babybear"> + %felt_const_1211644016 = felt.const 1211644016 : <"babybear"> + %felt_const_3164445985 = felt.const 3164445985 : <"babybear"> + %felt_const_2912064063 = felt.const 2912064063 : <"babybear"> + %felt_const_2324664069 = felt.const 2324664069 : <"babybear"> + %felt_const_3225436288 = felt.const 3225436288 : <"babybear"> + %felt_const_4272137053 = felt.const 4272137053 : <"babybear"> + %felt_const_4082192802 = felt.const 4082192802 : <"babybear"> + %felt_const_3819481163 = felt.const 3819481163 : <"babybear"> + %felt_const_3131023141 = felt.const 3131023141 : <"babybear"> + %felt_const_1144798328 = felt.const 1144798328 : <"babybear"> + %felt_const_4031795360 = felt.const 4031795360 : <"babybear"> + %felt_const_2172616702 = felt.const 2172616702 : <"babybear"> + %felt_const_100794884 = felt.const 100794884 : <"babybear"> + %felt_const_284817897 = felt.const 284817897 : <"babybear"> + %felt_const_3477423498 = felt.const 3477423498 : <"babybear"> + %felt_const_2491778321 = felt.const 2491778321 : <"babybear"> + %felt_const_1429418854 = felt.const 1429418854 : <"babybear"> + %felt_const_3612167578 = felt.const 3612167578 : <"babybear"> + %felt_const_3309519750 = felt.const 3309519750 : <"babybear"> + %felt_const_385612781 = felt.const 385612781 : <"babybear"> + %felt_const_3853167183 = felt.const 3853167183 : <"babybear"> + %felt_const_720367557 = felt.const 720367557 : <"babybear"> + %felt_const_1808847035 = felt.const 1808847035 : <"babybear"> + %felt_const_1255133061 = felt.const 1255133061 : <"babybear"> + %felt_const_3898103984 = felt.const 3898103984 : <"babybear"> + %felt_const_3561770136 = felt.const 3561770136 : <"babybear"> + %felt_const_3729410708 = felt.const 3729410708 : <"babybear"> + %felt_const_1262041458 = felt.const 1262041458 : <"babybear"> + %felt_const_3653156455 = felt.const 3653156455 : <"babybear"> + %felt_const_1187761037 = felt.const 1187761037 : <"babybear"> + %felt_const_3194645204 = felt.const 3194645204 : <"babybear"> + %felt_const_3982187446 = felt.const 3982187446 : <"babybear"> + %felt_const_3367088505 = felt.const 3367088505 : <"babybear"> + %felt_const_536673507 = felt.const 536673507 : <"babybear"> + %felt_const_1612718144 = felt.const 1612718144 : <"babybear"> + %felt_const_753790401 = felt.const 753790401 : <"babybear"> + %felt_const_1758581177 = felt.const 1758581177 : <"babybear"> + %felt_const_4115878822 = felt.const 4115878822 : <"babybear"> + %felt_const_2542044179 = felt.const 2542044179 : <"babybear"> + %felt_const_1898917726 = felt.const 1898917726 : <"babybear"> + %felt_const_1055122397 = felt.const 1055122397 : <"babybear"> + %felt_const_2066295122 = felt.const 2066295122 : <"babybear"> + %felt_const_3467883389 = felt.const 3467883389 : <"babybear"> + %felt_const_1641469623 = felt.const 1641469623 : <"babybear"> + %felt_const_1295727478 = felt.const 1295727478 : <"babybear"> + %felt_const_4132590244 = felt.const 4132590244 : <"babybear"> + %felt_const_4221608027 = felt.const 4221608027 : <"babybear"> + %felt_const_3998898868 = felt.const 3998898868 : <"babybear"> + %felt_const_2993581788 = felt.const 2993581788 : <"babybear"> + %felt_const_756751158 = felt.const 756751158 : <"babybear"> + %felt_const_773462580 = felt.const 773462580 : <"babybear"> + %felt_const_1949051992 = felt.const 1949051992 : <"babybear"> + %felt_const_2659418909 = felt.const 2659418909 : <"babybear"> + %felt_const_453576978 = felt.const 453576978 : <"babybear"> + %felt_const_2675275242 = felt.const 2675275242 : <"babybear"> + %felt_const_3451040383 = felt.const 3451040383 : <"babybear"> + %felt_const_1764173646 = felt.const 1764173646 : <"babybear"> + %felt_const_652995533 = felt.const 652995533 : <"babybear"> + %felt_const_1038279391 = felt.const 1038279391 : <"babybear"> + %felt_const_2608889883 = felt.const 2608889883 : <"babybear"> + %felt_const_907153956 = felt.const 907153956 : <"babybear"> + %felt_const_151455502 = felt.const 151455502 : <"babybear"> + %felt_const_3046808111 = felt.const 3046808111 : <"babybear"> + %felt_const_251987210 = felt.const 251987210 : <"babybear"> + %felt_const_2711000631 = felt.const 2711000631 : <"babybear"> + %felt_const_672667696 = felt.const 672667696 : <"babybear"> + %felt_const_1589887901 = felt.const 1589887901 : <"babybear"> + %felt_const_1696801606 = felt.const 1696801606 : <"babybear"> + %felt_const_1388824469 = felt.const 1388824469 : <"babybear"> + %felt_const_201589768 = felt.const 201589768 : <"babybear"> + %felt_const_1058346282 = felt.const 1058346282 : <"babybear"> + %felt_const_1395732834 = felt.const 1395732834 : <"babybear"> + %felt_const_1943591083 = felt.const 1943591083 : <"babybear"> + %felt_const_2473685474 = felt.const 2473685474 : <"babybear"> + %felt_const_150073849 = felt.const 150073849 : <"babybear"> + %felt_const_887481809 = felt.const 887481809 : <"babybear"> + %felt_const_4104496465 = felt.const 4104496465 : <"babybear"> + %felt_const_1546925160 = felt.const 1546925160 : <"babybear"> + %felt_const_1338821763 = felt.const 1338821763 : <"babybear"> + %felt_const_49805301 = felt.const 49805301 : <"babybear"> + %felt_const_1094664062 = felt.const 1094664062 : <"babybear"> + %felt_const_1513502316 = felt.const 1513502316 : <"babybear"> + %felt_const_1780885068 = felt.const 1780885068 : <"babybear"> + %felt_const_2928907069 = felt.const 2928907069 : <"babybear"> + %felt_const_486407649 = felt.const 486407649 : <"babybear"> + %felt_const_3266819957 = felt.const 3266819957 : <"babybear"> + %felt_const_1539358875 = felt.const 1539358875 : <"babybear"> + %felt_const_2524082916 = felt.const 2524082916 : <"babybear"> + %felt_const_4154762323 = felt.const 4154762323 : <"babybear"> + %felt_const_3214711843 = felt.const 3214711843 : <"babybear"> + %felt_const_3937382213 = felt.const 3937382213 : <"babybear"> + %felt_const_4255294047 = felt.const 4255294047 : <"babybear"> + %felt_const_1742001331 = felt.const 1742001331 : <"babybear"> + %felt_const_3970805057 = felt.const 3970805057 : <"babybear"> + %felt_const_200339707 = felt.const 200339707 : <"babybear"> + %felt_const_3376891790 = felt.const 3376891790 : <"babybear"> + %felt_const_3948501426 = felt.const 3948501426 : <"babybear"> + %felt_const_368769775 = felt.const 368769775 : <"babybear"> + %felt_const_2273148410 = felt.const 2273148410 : <"babybear"> + %felt_const_1086966153 = felt.const 1086966153 : <"babybear"> + %felt_const_2642575903 = felt.const 2642575903 : <"babybear"> + %felt_const_1170918031 = felt.const 1170918031 : <"babybear"> + %felt_const_2591454956 = felt.const 2591454956 : <"babybear"> + %felt_const_3870010189 = felt.const 3870010189 : <"babybear"> + %felt_const_1658312629 = felt.const 1658312629 : <"babybear"> + %felt_const_436141799 = felt.const 436141799 : <"babybear"> + %felt_const_2099981142 = felt.const 2099981142 : <"babybear"> + %felt_const_2842126286 = felt.const 2842126286 : <"babybear"> + %felt_const_50397442 = felt.const 50397442 : <"babybear"> + %felt_const_1345335392 = felt.const 1345335392 : <"babybear"> + %felt_const_1422247313 = felt.const 1422247313 : <"babybear"> + %felt_const_2976870366 = felt.const 2976870366 : <"babybear"> + %felt_const_3177933782 = felt.const 3177933782 : <"babybear"> + %felt_const_234025727 = felt.const 234025727 : <"babybear"> + %felt_const_2373680118 = felt.const 2373680118 : <"babybear"> + %felt_const_2574743534 = felt.const 2574743534 : <"babybear"> + %felt_const_2222750968 = felt.const 2222750968 : <"babybear"> + %felt_const_2774754246 = felt.const 2774754246 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<4,256 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<256 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c100] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c101] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c102] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c103] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c104] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c105] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c106] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c107] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c108] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c109] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c110] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c111] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c112] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c113] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c114] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c115] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c116] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c117] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c118] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c119] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c120] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c121] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c122] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c123] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c124] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c125] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c126] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c127] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c128] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c129] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c130] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c131] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c132] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c133] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c134] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c135] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c136] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c137] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c138] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c139] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c140] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c141] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c142] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c143] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c144] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c145] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c146] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c147] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c148] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c149] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c150] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c151] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c152] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c153] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c154] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c155] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c156] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c157] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c158] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c159] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c160] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c161] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c162] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c163] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c164] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c165] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c166] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c167] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c168] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c169] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c170] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c171] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c172] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c173] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c174] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c175] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c176] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c177] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c178] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c179] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c180] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c181] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c182] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c183] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c184] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c185] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c186] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c187] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c188] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c189] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c190] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c191] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c192] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c193] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c194] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c195] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c196] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c197] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c198] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c199] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c200] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c201] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c202] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c203] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c204] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c205] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c206] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c207] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c208] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c209] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c210] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c211] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c212] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c213] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c214] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c215] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c216] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c217] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c218] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c219] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c220] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c221] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c222] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c223] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c224] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c225] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c226] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c227] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c228] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c229] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c230] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c231] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c232] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c233] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c234] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c235] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c236] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c237] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c238] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c239] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c240] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c241] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c242] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c243] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c244] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c245] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c246] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c247] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c248] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c249] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c250] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c251] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c252] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c253] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c255] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.insert %nondet[%c2] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.insert %nondet[%c3] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.write %nondet[%c0, %c0] = %felt_const_2774754246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c1] = %felt_const_2222750968 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c2] = %felt_const_2574743534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c3] = %felt_const_2373680118 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c4] = %felt_const_234025727 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c5] = %felt_const_3177933782 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c6] = %felt_const_2976870366 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c7] = %felt_const_1422247313 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c8] = %felt_const_1345335392 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c9] = %felt_const_50397442 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c10] = %felt_const_2842126286 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c11] = %felt_const_2099981142 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c12] = %felt_const_436141799 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c13] = %felt_const_1658312629 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c14] = %felt_const_3870010189 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c15] = %felt_const_2591454956 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c16] = %felt_const_1170918031 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c17] = %felt_const_2642575903 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c18] = %felt_const_1086966153 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c19] = %felt_const_2273148410 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c20] = %felt_const_368769775 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c21] = %felt_const_3948501426 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c22] = %felt_const_3376891790 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c23] = %felt_const_200339707 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c24] = %felt_const_3970805057 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c25] = %felt_const_1742001331 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c26] = %felt_const_4255294047 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c27] = %felt_const_3937382213 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c28] = %felt_const_3214711843 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c29] = %felt_const_4154762323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c30] = %felt_const_2524082916 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c31] = %felt_const_1539358875 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c32] = %felt_const_3266819957 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c33] = %felt_const_486407649 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c34] = %felt_const_2928907069 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c35] = %felt_const_1780885068 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c36] = %felt_const_1513502316 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c37] = %felt_const_1094664062 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c38] = %felt_const_49805301 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c39] = %felt_const_1338821763 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c40] = %felt_const_1546925160 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c41] = %felt_const_4104496465 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c42] = %felt_const_887481809 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c43] = %felt_const_150073849 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c44] = %felt_const_2473685474 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c45] = %felt_const_1943591083 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c46] = %felt_const_1395732834 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c47] = %felt_const_1058346282 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c48] = %felt_const_201589768 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c49] = %felt_const_1388824469 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c50] = %felt_const_1696801606 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c51] = %felt_const_1589887901 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c52] = %felt_const_672667696 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c53] = %felt_const_2711000631 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c54] = %felt_const_251987210 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c55] = %felt_const_3046808111 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c56] = %felt_const_151455502 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c57] = %felt_const_907153956 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c58] = %felt_const_2608889883 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c59] = %felt_const_1038279391 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c60] = %felt_const_652995533 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c61] = %felt_const_1764173646 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c62] = %felt_const_3451040383 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c63] = %felt_const_2675275242 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c64] = %felt_const_453576978 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c65] = %felt_const_2659418909 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c66] = %felt_const_1949051992 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c67] = %felt_const_773462580 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c68] = %felt_const_756751158 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c69] = %felt_const_2993581788 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c70] = %felt_const_3998898868 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c71] = %felt_const_4221608027 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c72] = %felt_const_4132590244 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c73] = %felt_const_1295727478 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c74] = %felt_const_1641469623 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c75] = %felt_const_3467883389 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c76] = %felt_const_2066295122 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c77] = %felt_const_1055122397 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c78] = %felt_const_1898917726 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c79] = %felt_const_2542044179 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c80] = %felt_const_4115878822 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c81] = %felt_const_1758581177 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c83] = %felt_const_753790401 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c84] = %felt_const_1612718144 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c85] = %felt_const_536673507 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c86] = %felt_const_3367088505 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c87] = %felt_const_3982187446 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c88] = %felt_const_3194645204 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c89] = %felt_const_1187761037 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c90] = %felt_const_3653156455 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c91] = %felt_const_1262041458 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c92] = %felt_const_3729410708 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c93] = %felt_const_3561770136 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c94] = %felt_const_3898103984 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c95] = %felt_const_1255133061 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c96] = %felt_const_1808847035 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c97] = %felt_const_720367557 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c98] = %felt_const_3853167183 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c99] = %felt_const_385612781 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c100] = %felt_const_3309519750 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c101] = %felt_const_3612167578 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c102] = %felt_const_1429418854 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c103] = %felt_const_2491778321 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c104] = %felt_const_3477423498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c105] = %felt_const_284817897 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c106] = %felt_const_100794884 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c107] = %felt_const_2172616702 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c108] = %felt_const_4031795360 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c109] = %felt_const_1144798328 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c110] = %felt_const_3131023141 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c111] = %felt_const_3819481163 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c112] = %felt_const_4082192802 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c113] = %felt_const_4272137053 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c114] = %felt_const_3225436288 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c115] = %felt_const_2324664069 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c116] = %felt_const_2912064063 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c117] = %felt_const_3164445985 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c118] = %felt_const_1211644016 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c119] = %felt_const_83228145 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c120] = %felt_const_3753688163 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c121] = %felt_const_3249976951 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c122] = %felt_const_1977277103 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c123] = %felt_const_1663115586 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c124] = %felt_const_806359072 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c125] = %felt_const_452984805 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c126] = %felt_const_250868733 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c127] = %felt_const_1842533055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c128] = %felt_const_1288555905 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c129] = %felt_const_336333848 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c130] = %felt_const_890442534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c131] = %felt_const_804056259 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c132] = %felt_const_3781124030 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c133] = %felt_const_2727843637 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c134] = %felt_const_3427026056 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c135] = %felt_const_957814574 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c136] = %felt_const_1472513171 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c137] = %felt_const_4071073621 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c138] = %felt_const_2189328124 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c139] = %felt_const_1195195770 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c140] = %felt_const_2892260552 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c141] = %felt_const_3881655738 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c142] = %felt_const_723065138 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c143] = %felt_const_2507371494 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c144] = %felt_const_2690670784 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c145] = %felt_const_2558624025 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c146] = %felt_const_3511635870 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c147] = %felt_const_2145180835 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c148] = %felt_const_1713513028 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c149] = %felt_const_2116692564 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c150] = %felt_const_2878378043 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c151] = %felt_const_2206763019 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c152] = %felt_const_3393603212 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c153] = %felt_const_703524551 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c154] = %felt_const_3552098411 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c155] = %felt_const_1007948840 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c156] = %felt_const_2044649127 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c157] = %felt_const_3797835452 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c158] = %felt_const_487262998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c159] = %felt_const_1994120109 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c160] = %felt_const_1004593371 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c161] = %felt_const_1446130276 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c162] = %felt_const_1312438900 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c163] = %felt_const_503974420 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c164] = %felt_const_3679013266 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c165] = %felt_const_168166924 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c166] = %felt_const_1814307912 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c167] = %felt_const_3831258296 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c168] = %felt_const_1573044895 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c169] = %felt_const_1859376061 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c170] = %felt_const_4021070915 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c171] = %felt_const_2791465668 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c172] = %felt_const_2828112185 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c173] = %felt_const_2761266481 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c174] = %felt_const_937747667 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c175] = %felt_const_2339994098 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c176] = %felt_const_854058965 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c177] = %felt_const_1137232011 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c178] = %felt_const_1496790894 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c179] = %felt_const_3077402074 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c180] = %felt_const_2358086913 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c181] = %felt_const_1691735473 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c182] = %felt_const_3528347292 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c183] = %felt_const_3769215305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c184] = %felt_const_3027004632 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c185] = %felt_const_4199962284 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c186] = %felt_const_133494003 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c187] = %felt_const_636152527 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c188] = %felt_const_2942657994 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c189] = %felt_const_2390391540 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c190] = %felt_const_3920539207 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c191] = %felt_const_403179536 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c192] = %felt_const_3585784431 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c193] = %felt_const_2289596656 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c194] = %felt_const_1864705354 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c195] = %felt_const_1915629148 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c196] = %felt_const_605822008 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c197] = %felt_const_4054230615 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c198] = %felt_const_3350508659 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c199] = %felt_const_1371981463 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c200] = %felt_const_602466507 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c201] = %felt_const_2094914977 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c202] = %felt_const_2624877800 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c203] = %felt_const_555687742 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c204] = %felt_const_3712699286 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c205] = %felt_const_3703422305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c206] = %felt_const_2257292045 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c207] = %felt_const_2240449039 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c208] = %felt_const_2423288032 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c209] = %felt_const_1111375484 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c210] = %felt_const_3300242801 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c211] = %felt_const_2858837708 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c212] = %felt_const_3628615824 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c213] = %felt_const_84083462 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c214] = %felt_const_32962295 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c215] = %felt_const_302911004 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c216] = %felt_const_2741068226 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c217] = %felt_const_1597322602 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c218] = %felt_const_4183250862 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c219] = %felt_const_3501832553 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c220] = %felt_const_2441512471 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c221] = %felt_const_1489093017 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c222] = %felt_const_656219450 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c223] = %felt_const_3114180135 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c224] = %felt_const_954327513 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c225] = %felt_const_335083755 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c226] = %felt_const_3013122091 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c227] = %felt_const_856756514 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c228] = %felt_const_3144247762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c229] = %felt_const_1893325225 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c230] = %felt_const_2307821063 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c231] = %felt_const_2811532339 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c232] = %felt_const_3063651117 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c233] = %felt_const_572399164 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c234] = %felt_const_2458355477 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c235] = %felt_const_552200649 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c236] = %felt_const_1238290055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c237] = %felt_const_4283782570 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c238] = %felt_const_2015897680 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c239] = %felt_const_2061492133 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c240] = %felt_const_2408352771 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c241] = %felt_const_4171342169 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c242] = %felt_const_2156497161 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c243] = %felt_const_386731290 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c244] = %felt_const_3669999461 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c245] = %felt_const_837215959 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c246] = %felt_const_3326231172 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c247] = %felt_const_3093850320 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c248] = %felt_const_3275833730 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c249] = %felt_const_2962856233 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c250] = %felt_const_1999449434 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c251] = %felt_const_286199582 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c252] = %felt_const_3417354363 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c253] = %felt_const_4233385128 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c254] = %felt_const_3602627437 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c255] = %felt_const_974525996 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c0] = %felt_const_1667483301 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c1] = %felt_const_2088564868 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c2] = %felt_const_2004348569 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c3] = %felt_const_2071721613 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c4] = %felt_const_4076011277 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c5] = %felt_const_1802229437 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c6] = %felt_const_1869602481 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c7] = %felt_const_3318059348 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c8] = %felt_const_808476752 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c9] = %felt_const_16843267 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c10] = %felt_const_1734856361 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c11] = %felt_const_724260477 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c12] = %felt_const_4278118169 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c13] = %felt_const_3621238114 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c14] = %felt_const_2880130534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c15] = %felt_const_1987505306 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c16] = %felt_const_3402272581 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c17] = %felt_const_2189565853 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c18] = %felt_const_3385428288 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c19] = %felt_const_2105408135 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c20] = %felt_const_4210749205 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c21] = %felt_const_1499050731 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c22] = %felt_const_1195871945 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c23] = %felt_const_4042324747 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c24] = %felt_const_2913812972 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c25] = %felt_const_3570709351 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c26] = %felt_const_2728550397 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c27] = %felt_const_2947499498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c28] = %felt_const_2627478463 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c29] = %felt_const_2762232823 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c30] = %felt_const_1920132246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c31] = %felt_const_3233848155 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c32] = %felt_const_3082253762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c33] = %felt_const_4261273884 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c34] = %felt_const_2475900334 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c35] = %felt_const_640044138 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c36] = %felt_const_909536346 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c37] = %felt_const_1061125697 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c38] = %felt_const_4160222466 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c39] = %felt_const_3435955023 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c40] = %felt_const_875849820 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c41] = %felt_const_2779075060 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c42] = %felt_const_3857043764 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c43] = %felt_const_4059166984 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c44] = %felt_const_1903288979 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c45] = %felt_const_3638078323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c46] = %felt_const_825320019 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c47] = %felt_const_353708607 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c48] = %felt_const_67373068 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c49] = %felt_const_3351745874 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c50] = %felt_const_589514341 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c51] = %felt_const_3284376926 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c52] = %felt_const_404238376 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c53] = %felt_const_2526427041 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c54] = %felt_const_84216335 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c55] = %felt_const_2593796021 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c56] = %felt_const_117902857 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c57] = %felt_const_303178806 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c58] = %felt_const_2155879323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c59] = %felt_const_3806519101 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c60] = %felt_const_3958099238 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c61] = %felt_const_656887401 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c62] = %felt_const_2998042573 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c63] = %felt_const_1970662047 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c64] = %felt_const_151589403 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c65] = %felt_const_2206408094 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c66] = %felt_const_741103732 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c67] = %felt_const_437924910 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c68] = %felt_const_454768173 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c69] = %felt_const_1852759218 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c70] = %felt_const_1515893998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c71] = %felt_const_2694863867 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c72] = %felt_const_1381147894 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c73] = %felt_const_993752653 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c74] = %felt_const_3604395873 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c75] = %felt_const_3014884814 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c76] = %felt_const_690573947 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c77] = %felt_const_3823361342 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c78] = %felt_const_791633521 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c79] = %felt_const_2223248279 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c80] = %felt_const_1397991157 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c81] = %felt_const_3520182632 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c83] = %felt_const_3991781676 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c84] = %felt_const_538984544 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c85] = %felt_const_4244431647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c86] = %felt_const_2981198280 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c87] = %felt_const_1532737261 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c88] = %felt_const_1785386174 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c89] = %felt_const_3419114822 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c90] = %felt_const_3200149465 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c91] = %felt_const_960066123 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c92] = %felt_const_1246401758 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c93] = %felt_const_1280088276 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c94] = %felt_const_1482207464 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c95] = %felt_const_3486483786 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c96] = %felt_const_3503340395 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c97] = %felt_const_4025468202 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c98] = %felt_const_2863288293 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c99] = %felt_const_4227591446 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c100] = %felt_const_1128498885 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c101] = %felt_const_1296931543 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c102] = %felt_const_859006549 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c103] = %felt_const_2240090516 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c104] = %felt_const_1162185423 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c105] = %felt_const_4193904912 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c106] = %felt_const_33686534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c107] = %felt_const_2139094657 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c108] = %felt_const_1347461360 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c109] = %felt_const_1010595908 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c110] = %felt_const_2678007226 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c111] = %felt_const_2829601763 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c112] = %felt_const_1364304627 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c113] = %felt_const_2745392638 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c114] = %felt_const_1077969088 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c115] = %felt_const_2408514954 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c116] = %felt_const_2459058093 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c117] = %felt_const_2644320700 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c118] = %felt_const_943222856 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c119] = %felt_const_4126535940 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c120] = %felt_const_3166462943 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c121] = %felt_const_3065411521 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c122] = %felt_const_3671764853 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c123] = %felt_const_555827811 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c124] = %felt_const_269492272 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c125] = %felt_const_4294960410 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c126] = %felt_const_4092853518 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c127] = %felt_const_3537026925 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c128] = %felt_const_3452797260 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c129] = %felt_const_202119188 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c130] = %felt_const_320022069 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c131] = %felt_const_3974939439 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c132] = %felt_const_1600110305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c133] = %felt_const_2543269282 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c134] = %felt_const_1145342156 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c135] = %felt_const_387395129 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c136] = %felt_const_3301217111 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c137] = %felt_const_2812761586 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c138] = %felt_const_2122251394 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c139] = %felt_const_1027439175 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c140] = %felt_const_1684326572 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c141] = %felt_const_1566423783 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c142] = %felt_const_421081643 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c143] = %felt_const_1936975509 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c144] = %felt_const_1616953504 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c145] = %felt_const_2172721560 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c146] = %felt_const_1330618065 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c147] = %felt_const_3705447295 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c148] = %felt_const_572671078 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c149] = %felt_const_707417214 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c150] = %felt_const_2425371563 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c151] = %felt_const_2290617219 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c152] = %felt_const_1179028682 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c153] = %felt_const_4008625961 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c154] = %felt_const_3099093971 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c155] = %felt_const_336865340 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c156] = %felt_const_3739133817 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c157] = %felt_const_1583267042 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c158] = %felt_const_185275933 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c159] = %felt_const_3688607094 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c160] = %felt_const_3772832571 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c161] = %felt_const_842163286 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c162] = %felt_const_976909390 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c163] = %felt_const_168432670 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c164] = %felt_const_1229558491 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c165] = %felt_const_101059594 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c166] = %felt_const_606357612 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c167] = %felt_const_1549580516 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c168] = %felt_const_3267534685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c169] = %felt_const_3553869166 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c170] = %felt_const_2896970735 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c171] = %felt_const_1650640038 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c172] = %felt_const_2442213800 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c173] = %felt_const_2509582756 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c174] = %felt_const_3840201527 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c175] = %felt_const_2038035083 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c176] = %felt_const_3890730290 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c177] = %felt_const_3368586051 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c178] = %felt_const_926379609 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c179] = %felt_const_1835915959 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c180] = %felt_const_2374828428 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c181] = %felt_const_3587551588 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c182] = %felt_const_1313774802 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c183] = %felt_const_2846444000 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c184] = %felt_const_1819072692 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c185] = %felt_const_1448520954 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c186] = %felt_const_4109693703 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c187] = %felt_const_3941256997 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c188] = %felt_const_1701169839 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c189] = %felt_const_2054878350 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c190] = %felt_const_2930657257 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c191] = %felt_const_134746136 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c192] = %felt_const_3132780501 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c193] = %felt_const_2021191816 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c194] = %felt_const_623200879 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c195] = %felt_const_774790258 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c196] = %felt_const_471611428 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c197] = %felt_const_2795919345 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c198] = %felt_const_3031724999 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c199] = %felt_const_3334903633 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c200] = %felt_const_3907570467 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c201] = %felt_const_3722289532 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c202] = %felt_const_1953818780 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c203] = %felt_const_522141217 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c204] = %felt_const_1263245021 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c205] = %felt_const_3183305180 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c206] = %felt_const_2341145990 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c207] = %felt_const_2324303749 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c208] = %felt_const_1886445712 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c209] = %felt_const_1044282434 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c210] = %felt_const_3048567236 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c211] = %felt_const_1718013098 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c212] = %felt_const_1212715224 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c213] = %felt_const_50529797 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c214] = %felt_const_4143380225 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c215] = %felt_const_235805714 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c216] = %felt_const_1633796771 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c217] = %felt_const_892693087 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c218] = %felt_const_1465364217 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c219] = %felt_const_3115936208 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c220] = %felt_const_2256934801 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c221] = %felt_const_3250690392 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c222] = %felt_const_488454695 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c223] = %felt_const_2661164985 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c224] = %felt_const_3789674808 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c225] = %felt_const_4177062675 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c226] = %felt_const_2560109491 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c227] = %felt_const_286335539 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c228] = %felt_const_1768542907 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c229] = %felt_const_3654920560 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c230] = %felt_const_2391672713 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c231] = %felt_const_2492740519 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c232] = %felt_const_2610638262 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c233] = %felt_const_505297954 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c234] = %felt_const_2273777042 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c235] = %felt_const_3924412704 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c236] = %felt_const_3469641545 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c237] = %felt_const_1431677695 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c238] = %felt_const_673730680 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c239] = %felt_const_3755976058 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c240] = %felt_const_2357986191 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c241] = %felt_const_2711706104 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c242] = %felt_const_2307459456 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c243] = %felt_const_218962455 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c244] = %felt_const_3216991706 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c245] = %felt_const_3873888049 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c246] = %felt_const_1111655622 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c247] = %felt_const_1751699640 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c248] = %felt_const_1094812355 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c249] = %felt_const_2576951728 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c250] = %felt_const_757946999 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c251] = %felt_const_252648977 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c252] = %felt_const_2964356043 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c253] = %felt_const_1414834428 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c254] = %felt_const_3149622742 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c255] = %felt_const_370551866 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c0] = %felt_const_1673962851 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c1] = %felt_const_2096661628 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c2] = %felt_const_2012125559 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c3] = %felt_const_2079755643 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c4] = %felt_const_4076801522 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c5] = %felt_const_1809235307 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c6] = %felt_const_1876865391 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c7] = %felt_const_3314635973 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c8] = %felt_const_811618352 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c9] = %felt_const_16909057 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c10] = %felt_const_1741597031 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c11] = %felt_const_727088427 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c12] = %felt_const_4276558334 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c13] = %felt_const_3618988759 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c14] = %felt_const_2874009259 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c15] = %felt_const_1995217526 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c16] = %felt_const_3398387146 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c17] = %felt_const_2183110018 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c18] = %felt_const_3381215433 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c19] = %felt_const_2113570685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c20] = %felt_const_4209972730 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c21] = %felt_const_1504897881 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c22] = %felt_const_1200539975 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c23] = %felt_const_4042984432 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c24] = %felt_const_2906778797 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c25] = %felt_const_3568527316 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c26] = %felt_const_2724199842 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c27] = %felt_const_2940594863 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c28] = %felt_const_2619588508 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c29] = %felt_const_2756966308 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c30] = %felt_const_1927583346 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c31] = %felt_const_3231407040 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c32] = %felt_const_3077948087 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c33] = %felt_const_4259388669 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c34] = %felt_const_2470293139 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c35] = %felt_const_642542118 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c36] = %felt_const_913070646 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c37] = %felt_const_1065238847 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c38] = %felt_const_4160029431 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c39] = %felt_const_3431157708 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c40] = %felt_const_879254580 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c41] = %felt_const_2773611685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c42] = %felt_const_3855693029 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c43] = %felt_const_4059629809 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c44] = %felt_const_1910674289 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c45] = %felt_const_3635114968 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c46] = %felt_const_828527409 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c47] = %felt_const_355090197 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c48] = %felt_const_67636228 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c49] = %felt_const_3348452039 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c50] = %felt_const_591815971 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c51] = %felt_const_3281870531 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c52] = %felt_const_405809176 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c53] = %felt_const_2520228246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c54] = %felt_const_84545285 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c55] = %felt_const_2586817946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c56] = %felt_const_118360327 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c57] = %felt_const_304363026 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c58] = %felt_const_2149292928 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c59] = %felt_const_3806281186 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c60] = %felt_const_3956090603 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c61] = %felt_const_659450151 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c62] = %felt_const_2994720178 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c63] = %felt_const_1978310517 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c64] = %felt_const_152181513 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c65] = %felt_const_2199756419 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c66] = %felt_const_743994412 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c67] = %felt_const_439627290 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c68] = %felt_const_456535323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c69] = %felt_const_1859957358 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c70] = %felt_const_1521806938 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c71] = %felt_const_2690382752 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c72] = %felt_const_1386542674 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c73] = %felt_const_997608763 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c74] = %felt_const_3602342358 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c75] = %felt_const_3011366579 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c76] = %felt_const_693271337 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c77] = %felt_const_3822927587 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c78] = %felt_const_794718511 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c79] = %felt_const_2215876484 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c80] = %felt_const_1403450707 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c81] = %felt_const_3518589137 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c83] = %felt_const_3988860141 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c84] = %felt_const_541089824 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c85] = %felt_const_4242743292 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c86] = %felt_const_2977548465 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c87] = %felt_const_1538714971 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c88] = %felt_const_1792327274 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c89] = %felt_const_3415033547 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c90] = %felt_const_3194476990 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c91] = %felt_const_963791673 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c92] = %felt_const_1251270218 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c93] = %felt_const_1285084236 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c94] = %felt_const_1487988824 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c95] = %felt_const_3481619151 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c96] = %felt_const_3501943760 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c97] = %felt_const_4022676207 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c98] = %felt_const_2857362858 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c99] = %felt_const_4226619131 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c100] = %felt_const_1132905795 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c101] = %felt_const_1301993293 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c102] = %felt_const_862344499 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c103] = %felt_const_2232521861 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c104] = %felt_const_1166724933 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c105] = %felt_const_4192801017 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c106] = %felt_const_33818114 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c107] = %felt_const_2147385727 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c108] = %felt_const_1352724560 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c109] = %felt_const_1014514748 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c110] = %felt_const_2670049951 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c111] = %felt_const_2823545768 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c112] = %felt_const_1369633617 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c113] = %felt_const_2740846243 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c114] = %felt_const_1082179648 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c115] = %felt_const_2399505039 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c116] = %felt_const_2453646738 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c117] = %felt_const_2636233885 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c118] = %felt_const_946882616 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c119] = %felt_const_4126213365 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c120] = %felt_const_3160661948 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c121] = %felt_const_3061301686 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c122] = %felt_const_3668932058 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c123] = %felt_const_557998881 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c124] = %felt_const_270544912 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c125] = %felt_const_4293204735 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c126] = %felt_const_4093447923 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c127] = %felt_const_3535760850 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c128] = %felt_const_3447803085 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c129] = %felt_const_202904588 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c130] = %felt_const_321271059 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c131] = %felt_const_3972214764 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c132] = %felt_const_1606345055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c133] = %felt_const_2536874647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c134] = %felt_const_1149815876 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c135] = %felt_const_388905239 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c136] = %felt_const_3297990596 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c137] = %felt_const_2807427751 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c138] = %felt_const_2130477694 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c139] = %felt_const_1031423805 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c140] = %felt_const_1690872932 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c141] = %felt_const_1572530013 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c142] = %felt_const_422718233 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c143] = %felt_const_1944491379 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c144] = %felt_const_1623236704 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c145] = %felt_const_2165938305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c146] = %felt_const_1335808335 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c147] = %felt_const_3701702620 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c148] = %felt_const_574907938 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c149] = %felt_const_710180394 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c150] = %felt_const_2419829648 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c151] = %felt_const_2282455944 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c152] = %felt_const_1183631942 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c153] = %felt_const_4006029806 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c154] = %felt_const_3094074296 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c155] = %felt_const_338181140 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c156] = %felt_const_3735517662 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c157] = %felt_const_1589437022 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c158] = %felt_const_185998603 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c159] = %felt_const_3685578459 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c160] = %felt_const_3772464096 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c161] = %felt_const_845436466 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c162] = %felt_const_980700730 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c163] = %felt_const_169090570 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c164] = %felt_const_1234361161 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c165] = %felt_const_101452294 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c166] = %felt_const_608726052 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c167] = %felt_const_1555620956 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c168] = %felt_const_3265224130 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c169] = %felt_const_3552407251 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c170] = %felt_const_2890133420 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c171] = %felt_const_1657054818 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c172] = %felt_const_2436475025 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c173] = %felt_const_2503058581 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c174] = %felt_const_3839047652 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c175] = %felt_const_2045938553 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c176] = %felt_const_3889509095 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c177] = %felt_const_3364570056 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c178] = %felt_const_929978679 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c179] = %felt_const_1843050349 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c180] = %felt_const_2365688973 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c181] = %felt_const_3585172693 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c182] = %felt_const_1318900302 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c183] = %felt_const_2840191145 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c184] = %felt_const_1826141292 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c185] = %felt_const_1454176854 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c186] = %felt_const_4109567988 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c187] = %felt_const_3939444202 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c188] = %felt_const_1707781989 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c189] = %felt_const_2062847610 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c190] = %felt_const_2923948462 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c191] = %felt_const_135272456 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c192] = %felt_const_3127891386 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c193] = %felt_const_2029029496 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c194] = %felt_const_625635109 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c195] = %felt_const_777810478 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c196] = %felt_const_473441308 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c197] = %felt_const_2790781350 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c198] = %felt_const_3027486644 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c199] = %felt_const_3331805638 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c200] = %felt_const_3905627112 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c201] = %felt_const_3718347997 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c202] = %felt_const_1961401460 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c203] = %felt_const_524165407 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c204] = %felt_const_1268178251 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c205] = %felt_const_3177307325 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c206] = %felt_const_2332919435 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c207] = %felt_const_2316273034 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c208] = %felt_const_1893765232 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c209] = %felt_const_1048330814 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c210] = %felt_const_3044132021 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c211] = %felt_const_1724688998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c212] = %felt_const_1217452104 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c213] = %felt_const_50726147 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c214] = %felt_const_4143383030 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c215] = %felt_const_236720654 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c216] = %felt_const_1640145761 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c217] = %felt_const_896163637 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c218] = %felt_const_1471084887 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c219] = %felt_const_3110719673 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c220] = %felt_const_2249691526 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c221] = %felt_const_3248052417 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c222] = %felt_const_490350365 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c223] = %felt_const_2653403550 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c224] = %felt_const_3789109473 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c225] = %felt_const_4176155640 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c226] = %felt_const_2553000856 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c227] = %felt_const_287453969 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c228] = %felt_const_1775418217 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c229] = %felt_const_3651760345 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c230] = %felt_const_2382858638 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c231] = %felt_const_2486413204 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c232] = %felt_const_2603464347 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c233] = %felt_const_507257374 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c234] = %felt_const_2266337927 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c235] = %felt_const_3922272489 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c236] = %felt_const_3464972750 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c237] = %felt_const_1437269845 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c238] = %felt_const_676362280 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c239] = %felt_const_3752164063 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c240] = %felt_const_2349043596 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c241] = %felt_const_2707028129 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c242] = %felt_const_2299101321 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c243] = %felt_const_219813645 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c244] = %felt_const_3211123391 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c245] = %felt_const_3872862694 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c246] = %felt_const_1115997762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c247] = %felt_const_1758509160 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c248] = %felt_const_1099088705 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c249] = %felt_const_2569646233 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c250] = %felt_const_760903469 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c251] = %felt_const_253628687 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c252] = %felt_const_2960903088 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c253] = %felt_const_1420360788 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c254] = %felt_const_3144537787 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c255] = %felt_const_371997206 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c0] = %felt_const_3332727651 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c1] = %felt_const_4169432188 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c2] = %felt_const_4003034999 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c3] = %felt_const_4136467323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c4] = %felt_const_4279104242 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c5] = %felt_const_3602738027 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c6] = %felt_const_3736170351 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c7] = %felt_const_2438251973 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c8] = %felt_const_1615867952 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c9] = %felt_const_33751297 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c10] = %felt_const_3467208551 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c11] = %felt_const_1451043627 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c12] = %felt_const_3877240574 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c13] = %felt_const_3043153879 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c14] = %felt_const_1306962859 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c15] = %felt_const_3969545846 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c16] = %felt_const_2403715786 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c17] = %felt_const_530416258 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c18] = %felt_const_2302724553 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c19] = %felt_const_4203183485 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c20] = %felt_const_4011195130 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c21] = %felt_const_3001768281 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c22] = %felt_const_2395555655 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c23] = %felt_const_4211863792 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c24] = %felt_const_1106029997 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c25] = %felt_const_3009926356 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c26] = %felt_const_1610457762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c27] = %felt_const_1173008303 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c28] = %felt_const_599760028 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c29] = %felt_const_1408738468 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c30] = %felt_const_3835064946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c31] = %felt_const_2606481600 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c32] = %felt_const_1975695287 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c33] = %felt_const_3776773629 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c34] = %felt_const_1034851219 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c35] = %felt_const_1282024998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c36] = %felt_const_1817851446 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c37] = %felt_const_2118205247 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c38] = %felt_const_4110612471 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c39] = %felt_const_2203045068 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c40] = %felt_const_1750873140 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c41] = %felt_const_1374987685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c42] = %felt_const_3509904869 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c43] = %felt_const_4178113009 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c44] = %felt_const_3801313649 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c45] = %felt_const_2876496088 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c46] = %felt_const_1649619249 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c47] = %felt_const_708777237 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c48] = %felt_const_135005188 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c49] = %felt_const_2505230279 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c50] = %felt_const_1181033251 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c51] = %felt_const_2640233411 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c52] = %felt_const_807933976 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c53] = %felt_const_933336726 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c54] = %felt_const_168756485 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c55] = %felt_const_800430746 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c56] = %felt_const_235472647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c57] = %felt_const_607523346 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c58] = %felt_const_463175808 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c59] = %felt_const_3745374946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c60] = %felt_const_3441880043 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c61] = %felt_const_1315514151 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c62] = %felt_const_2144187058 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c63] = %felt_const_3936318837 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c64] = %felt_const_303761673 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c65] = %felt_const_496927619 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c66] = %felt_const_1484008492 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c67] = %felt_const_875436570 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c68] = %felt_const_908925723 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c69] = %felt_const_3702681198 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c70] = %felt_const_3035519578 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c71] = %felt_const_1543217312 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c72] = %felt_const_2767606354 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c73] = %felt_const_1984772923 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c74] = %felt_const_3076642518 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c75] = %felt_const_2110698419 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c76] = %felt_const_1383803177 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c77] = %felt_const_3711886307 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c78] = %felt_const_1584475951 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c79] = %felt_const_328696964 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c80] = %felt_const_2801095507 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c81] = %felt_const_3110654417 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c83] = %felt_const_3240947181 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c84] = %felt_const_1080041504 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c85] = %felt_const_3810524412 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c86] = %felt_const_2043195825 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c87] = %felt_const_3069008731 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c88] = %felt_const_3569248874 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c89] = %felt_const_2370227147 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c90] = %felt_const_1742323390 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c91] = %felt_const_1917532473 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c92] = %felt_const_2497595978 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c93] = %felt_const_2564049996 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c94] = %felt_const_2968016984 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c95] = %felt_const_2236272591 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c96] = %felt_const_3144405200 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c97] = %felt_const_3307925487 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c98] = %felt_const_1340451498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c99] = %felt_const_3977706491 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c100] = %felt_const_2261074755 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c101] = %felt_const_2597801293 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c102] = %felt_const_1716859699 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c103] = %felt_const_294946181 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c104] = %felt_const_2328839493 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c105] = %felt_const_3910203897 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c106] = %felt_const_67502594 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c107] = %felt_const_4269899647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c108] = %felt_const_2700103760 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c109] = %felt_const_2017737788 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c110] = %felt_const_632987551 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c111] = %felt_const_1273211048 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c112] = %felt_const_2733855057 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c113] = %felt_const_1576969123 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c114] = %felt_const_2160083008 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c115] = %felt_const_92966799 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c116] = %felt_const_1068339858 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c117] = %felt_const_566009245 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c118] = %felt_const_1883781176 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c119] = %felt_const_4043634165 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c120] = %felt_const_1675607228 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c121] = %felt_const_2009183926 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c122] = %felt_const_2943736538 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c123] = %felt_const_1113792801 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c124] = %felt_const_540020752 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c125] = %felt_const_3843751935 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c126] = %felt_const_4245615603 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c127] = %felt_const_3211645650 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c128] = %felt_const_2169294285 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c129] = %felt_const_403966988 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c130] = %felt_const_641012499 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c131] = %felt_const_3274697964 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c132] = %felt_const_3202441055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c133] = %felt_const_899848087 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c134] = %felt_const_2295088196 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c135] = %felt_const_775493399 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c136] = %felt_const_2472002756 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c137] = %felt_const_1441965991 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c138] = %felt_const_4236410494 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c139] = %felt_const_2051489085 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c140] = %felt_const_3366741092 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c141] = %felt_const_3135724893 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c142] = %felt_const_841685273 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c143] = %felt_const_3868554099 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c144] = %felt_const_3231735904 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c145] = %felt_const_429425025 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c146] = %felt_const_2664517455 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c147] = %felt_const_2743065820 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c148] = %felt_const_1147544098 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c149] = %felt_const_1417554474 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c150] = %felt_const_1001099408 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c151] = %felt_const_193169544 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c152] = %felt_const_2362066502 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c153] = %felt_const_3341414126 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c154] = %felt_const_1809037496 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c155] = %felt_const_675025940 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c156] = %felt_const_2809781982 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c157] = %felt_const_3168951902 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c158] = %felt_const_371002123 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c159] = %felt_const_2910247899 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c160] = %felt_const_3678134496 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c161] = %felt_const_1683370546 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c162] = %felt_const_1951283770 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c163] = %felt_const_337512970 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c164] = %felt_const_2463844681 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c165] = %felt_const_201983494 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c166] = %felt_const_1215046692 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c167] = %felt_const_3101973596 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c168] = %felt_const_2673722050 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c169] = %felt_const_3178157011 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c170] = %felt_const_1139780780 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c171] = %felt_const_3299238498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c172] = %felt_const_967348625 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c173] = %felt_const_832869781 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c174] = %felt_const_3543655652 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c175] = %felt_const_4069226873 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c176] = %felt_const_3576883175 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c177] = %felt_const_2336475336 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c178] = %felt_const_1851340599 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c179] = %felt_const_3669454189 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c180] = %felt_const_25988493 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c181] = %felt_const_2976175573 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c182] = %felt_const_2631028302 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c183] = %felt_const_1239460265 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c184] = %felt_const_3635702892 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c185] = %felt_const_2902087254 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c186] = %felt_const_4077384948 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c187] = %felt_const_3475368682 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c188] = %felt_const_3400492389 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c189] = %felt_const_4102978170 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c190] = %felt_const_1206496942 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c191] = %felt_const_270010376 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c192] = %felt_const_1876277946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c193] = %felt_const_4035475576 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c194] = %felt_const_1248797989 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c195] = %felt_const_1550986798 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c196] = %felt_const_941890588 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c197] = %felt_const_1475454630 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c198] = %felt_const_1942467764 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c199] = %felt_const_2538718918 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c200] = %felt_const_3408128232 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c201] = %felt_const_2709315037 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c202] = %felt_const_3902567540 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c203] = %felt_const_1042358047 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c204] = %felt_const_2531085131 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c205] = %felt_const_1641856445 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c206] = %felt_const_226921355 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c207] = %felt_const_260409994 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c208] = %felt_const_3767562352 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c209] = %felt_const_2084716094 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c210] = %felt_const_1908716981 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c211] = %felt_const_3433719398 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c212] = %felt_const_2430093384 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c213] = %felt_const_100991747 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c214] = %felt_const_4144101110 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c215] = %felt_const_470945294 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c216] = %felt_const_3265487201 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c217] = %felt_const_1784624437 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c218] = %felt_const_2935576407 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c219] = %felt_const_1775286713 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c220] = %felt_const_395413126 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c221] = %felt_const_2572730817 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c222] = %felt_const_975641885 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c223] = %felt_const_666476190 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c224] = %felt_const_3644383713 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c225] = %felt_const_3943954680 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c226] = %felt_const_733190296 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c227] = %felt_const_573772049 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c228] = %felt_const_3535497577 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c229] = %felt_const_2842745305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c230] = %felt_const_126455438 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c231] = %felt_const_866620564 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c232] = %felt_const_766942107 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c233] = %felt_const_1008868894 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c234] = %felt_const_361924487 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c235] = %felt_const_3374377449 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c236] = %felt_const_2269761230 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c237] = %felt_const_2868860245 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c238] = %felt_const_1350051880 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c239] = %felt_const_2776293343 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c240] = %felt_const_59739276 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c241] = %felt_const_1509466529 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c242] = %felt_const_159418761 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c243] = %felt_const_437718285 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c244] = %felt_const_1708834751 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c245] = %felt_const_3610371814 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c246] = %felt_const_2227585602 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c247] = %felt_const_3501746280 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c248] = %felt_const_2193834305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c249] = %felt_const_699439513 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c250] = %felt_const_1517759789 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c251] = %felt_const_504434447 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c252] = %felt_const_2076946608 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c253] = %felt_const_2835108948 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c254] = %felt_const_1842789307 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c255] = %felt_const_742004246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg0 : !felt.type<"babybear"> + %1 = cast.toindex %arg1 : !felt.type<"babybear"> + %2 = array.read %nondet[%0, %1] : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %2 : !felt.type<"babybear"> + } + poly.template @XOR_0 { + struct.def @XOR_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_0::@XOR_0<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_0::@XOR_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_0::@XOR_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Bits2Num_1 { + struct.def @Bits2Num_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %0#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @EmulatedAesencRowShifting_3 { + struct.def @EmulatedAesencRowShifting_3 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_15 = felt.const 15 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %felt_const_13 = felt.const 13 : <"babybear"> + %felt_const_12 = felt.const 12 : <"babybear"> + %felt_const_11 = felt.const 11 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %felt_const_5 = felt.const 5 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_10 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_15 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_2 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_11 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c0 to %c16 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> + function.return %self : !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_15 = felt.const 15 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %felt_const_13 = felt.const 13 : <"babybear"> + %felt_const_12 = felt.const 12 : <"babybear"> + %felt_const_11 = felt.const 11 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %felt_const_5 = felt.const 5 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_10 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_15 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_2 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_11 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c16 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @EmulatedAesencSubstituteBytes_4 { + struct.def @EmulatedAesencSubstituteBytes_4 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c16 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = function.call @emulated_aesenc_rijndael_sbox_0(%2) : (!felt.type<"babybear">) -> !felt.type<"babybear"> + %4 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> + function.return %self : !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> + function.return + } + } + } + poly.template @Num2Bits_5 { + struct.def @Num2Bits_5 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @AES256Encrypt_6 { + struct.def @AES256Encrypt_6 { + struct.member @out : !array.type<128 x !felt.type<"babybear">> {llzk.pub} + struct.member @sub_bytes : !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + struct.member @sub_bytes$inputs : !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + struct.member @xor_3 : !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_3$inputs : !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @bits2num_2 : !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + struct.member @bits2num_2$inputs : !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + struct.member @xor_1 : !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_1$inputs : !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @num2bits_1 : !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @num2bits_1$inputs : !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @num2bits_2 : !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> + struct.member @num2bits_2$inputs : !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @xor_2 : !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_2$inputs : !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @xor_4 : !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_4$inputs : !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @row_shifting : !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + struct.member @row_shifting$inputs : !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + struct.member @bits2num_1 : !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + struct.member @bits2num_1$inputs : !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<128 x !felt.type<"babybear">>, %arg1: !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_32 = felt.const 32 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c3 = arith.constant 3 : index + %c8 = arith.constant 8 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32 = arith.constant 32 : index + %c4 = arith.constant 4 : index + %c13 = arith.constant 13 : index + %c16 = arith.constant 16 : index + %self = struct.new : <@AES256Encrypt_6::@AES256Encrypt_6<[]>> + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> + %pod = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> + %array = array.new : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %5 = array.read %array[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2, %arg3, %arg4] = %5 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_1 = array.new : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_2 = array.new : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_2[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_2[%arg2] = %5 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + } + %array_3 = array.new : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + %array_4 = array.new : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_4[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_4[%arg2, %arg3] = %5 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + } + %array_5 = array.new : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_6 = array.new : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array_6[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array_6[%arg2, %arg3, %arg4] = %5 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_7 = array.new : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_8 = array.new : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_8[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array_8[%arg2] = %5 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + } + %array_9 = array.new : <16 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_10 = array.new : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %5 = array.read %array_10[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_10[%arg2, %arg3, %arg4, %arg5] = %5 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_11 = array.new : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_12 = array.new : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_12[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_12[%arg2, %arg3] = %5 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + } + %array_13 = array.new : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %pod_14 = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]> + %pod_15 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> + %array_16 = array.new : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array_16[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + pod.write %5[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_16[%arg2, %arg3, %arg4] = %5 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_17 = array.new : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + %nondet_18 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> + %nondet_19 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + array.write %nondet_19[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_19[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet_18[%c0] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_18[%c1] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_18[%c2] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_18[%c3] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + %nondet_20 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> + %nondet_21 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + array.write %nondet_21[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_21[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet_20[%c0] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_20[%c1] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_20[%c2] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_20[%c3] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %5, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg0[%13] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %5 : !felt.type<"babybear"> + %16 = cast.toindex %9 : !felt.type<"babybear"> + %17 = array.read %array_5[%15, %16] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %17[@a] = %14 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_5[%18, %19] = %17 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %20 = cast.toindex %5 : !felt.type<"babybear"> + %21 = cast.toindex %9 : !felt.type<"babybear"> + %22 = array.read %array_4[%20, %21] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.subi %23, %c1 : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %25 = arith.cmpi eq, %24, %c0 : index + scf.if %25 { + %50 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %52 = function.call @XOR_0::@XOR_0::@compute(%50, %51) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %22[@comp] = %52 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %53 = cast.toindex %5 : !felt.type<"babybear"> + %54 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_4[%53, %54] = %22 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %26 = felt.add %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = felt.mul %26, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.add %27, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %28 : !felt.type<"babybear"> + %30 = array.read %arg1[%29] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %5 : !felt.type<"babybear"> + %32 = cast.toindex %9 : !felt.type<"babybear"> + %33 = array.read %array_5[%31, %32] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %33[@b] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %34 = cast.toindex %5 : !felt.type<"babybear"> + %35 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_5[%34, %35] = %33 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %36 = cast.toindex %5 : !felt.type<"babybear"> + %37 = cast.toindex %9 : !felt.type<"babybear"> + %38 = array.read %array_4[%36, %37] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.subi %39, %c1 : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.cmpi eq, %40, %c0 : index + scf.if %41 { + %50 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %52 = function.call @XOR_0::@XOR_0::@compute(%50, %51) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %38[@comp] = %52 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %53 = cast.toindex %5 : !felt.type<"babybear"> + %54 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_4[%53, %54] = %38 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %42 = cast.toindex %5 : !felt.type<"babybear"> + %43 = cast.toindex %9 : !felt.type<"babybear"> + %44 = array.read %array_4[%42, %43] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %46 = struct.readm %45[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %47 = cast.toindex %5 : !felt.type<"babybear"> + %48 = cast.toindex %9 : !felt.type<"babybear"> + array.write %nondet_18[%47, %48] = %46 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + %0:5 = scf.for %arg2 = %c0 to %c13 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0, %arg6 = %felt_const_4, %arg7 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6:4 = scf.for %arg8 = %c0 to %c4 step %c1 iter_args(%arg9 = %arg7, %arg10 = %arg5, %arg11 = %arg3, %arg12 = %arg4) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %13:4 = scf.while (%arg13 = %arg9, %arg14 = %felt_const_0, %arg15 = %arg11, %arg16 = %arg12) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %14 = bool.cmp lt(%arg14, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%14) %arg13, %arg14, %arg15, %arg16 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg13: !felt.type<"babybear">, %arg14: !felt.type<"babybear">, %arg15: !felt.type<"babybear">, %arg16: !felt.type<"babybear">): + %nondet_31 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + array.write %nondet_31[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_31[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %12, %arg14 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.umod %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.extract %nondet_18[%16] : <4,32 x !felt.type<"babybear">> + scf.for %arg17 = %c0 to %c8 step %c1 { + %42 = cast.tofelt %arg17 : index, !felt.type<"babybear"> + %43 = felt.mul %arg14, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = felt.add %43, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = felt.sub %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = cast.toindex %45 : !felt.type<"babybear"> + %47 = array.read %17[%46] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = cast.toindex %5 : !felt.type<"babybear"> + %49 = cast.toindex %12 : !felt.type<"babybear"> + %50 = cast.toindex %arg14 : !felt.type<"babybear"> + %51 = array.read %array_17[%48, %49, %50] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %52 = pod.read %51[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %53 = cast.toindex %42 : !felt.type<"babybear"> + array.write %52[%53] = %47 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = cast.toindex %5 : !felt.type<"babybear"> + %55 = cast.toindex %12 : !felt.type<"babybear"> + %56 = cast.toindex %arg14 : !felt.type<"babybear"> + %57 = array.read %array_17[%54, %55, %56] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + pod.write %57[@in] = %52 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %58 = cast.toindex %5 : !felt.type<"babybear"> + %59 = cast.toindex %12 : !felt.type<"babybear"> + %60 = cast.toindex %arg14 : !felt.type<"babybear"> + array.write %array_17[%58, %59, %60] = %57 : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %61 = cast.toindex %5 : !felt.type<"babybear"> + %62 = cast.toindex %12 : !felt.type<"babybear"> + %63 = cast.toindex %arg14 : !felt.type<"babybear"> + %64 = array.read %array_16[%61, %62, %63] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + %65 = pod.read %64[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index + %66 = arith.subi %65, %c1 : index + pod.write %64[@count] = %66 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index + %67 = arith.cmpi eq, %66, %c0 : index + scf.if %67 { + %68 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %69 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%68) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + pod.write %64[@comp] = %69 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %70 = cast.toindex %5 : !felt.type<"babybear"> + %71 = cast.toindex %12 : !felt.type<"babybear"> + %72 = cast.toindex %arg14 : !felt.type<"babybear"> + array.write %array_16[%70, %71, %72] = %64 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + } + } + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = cast.toindex %arg14 : !felt.type<"babybear"> + %21 = array.read %array_16[%18, %19, %20] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %23 = struct.readm %22[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + %24 = function.call @emulated_aesenc_enc_table_1(%arg14, %23) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> + %25 = cast.toindex %5 : !felt.type<"babybear"> + %26 = cast.toindex %12 : !felt.type<"babybear"> + %27 = cast.toindex %arg14 : !felt.type<"babybear"> + %28 = array.read %array_7[%25, %26, %27] : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %28[@in] = %24 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %29 = cast.toindex %5 : !felt.type<"babybear"> + %30 = cast.toindex %12 : !felt.type<"babybear"> + %31 = cast.toindex %arg14 : !felt.type<"babybear"> + array.write %array_7[%29, %30, %31] = %28 : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %32 = cast.toindex %5 : !felt.type<"babybear"> + %33 = cast.toindex %12 : !felt.type<"babybear"> + %34 = cast.toindex %arg14 : !felt.type<"babybear"> + %35 = array.read %array_6[%32, %33, %34] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.subi %36, %c1 : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.cmpi eq, %37, %c0 : index + scf.if %38 { + %42 = pod.read %28[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %43 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%42) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %35[@comp] = %43 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %44 = cast.toindex %5 : !felt.type<"babybear"> + %45 = cast.toindex %12 : !felt.type<"babybear"> + %46 = cast.toindex %arg14 : !felt.type<"babybear"> + array.write %array_6[%44, %45, %46] = %35 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + %39 = bool.cmp eq(%arg14, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %40:2 = scf.if %39 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %42:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %43 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%43) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %43 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %45 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%45) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %45 = cast.toindex %5 : !felt.type<"babybear"> + %46 = cast.toindex %12 : !felt.type<"babybear"> + %47 = array.read %array_6[%45, %46, %c0] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %48 = pod.read %47[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %49 = struct.readm %48[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> + %50 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = felt.add %50, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %52 = felt.sub %51, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + %54 = array.read %49[%53] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = cast.toindex %5 : !felt.type<"babybear"> + %56 = cast.toindex %12 : !felt.type<"babybear"> + %57 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %58 = felt.add %57, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = cast.toindex %58 : !felt.type<"babybear"> + %60 = array.read %array_11[%55, %56, %c0, %59] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %60[@a] = %54 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = cast.toindex %5 : !felt.type<"babybear"> + %62 = cast.toindex %12 : !felt.type<"babybear"> + %63 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = felt.add %63, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %65 = cast.toindex %64 : !felt.type<"babybear"> + array.write %array_11[%61, %62, %c0, %65] = %60 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %66 = cast.toindex %5 : !felt.type<"babybear"> + %67 = cast.toindex %12 : !felt.type<"babybear"> + %68 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = felt.add %68, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %70 = cast.toindex %69 : !felt.type<"babybear"> + %71 = array.read %array_10[%66, %67, %c0, %70] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %72 = pod.read %71[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %73 = arith.subi %72, %c1 : index + pod.write %71[@count] = %73 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %74 = arith.cmpi eq, %73, %c0 : index + scf.if %74 { + %76 = pod.read %60[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %77 = pod.read %60[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %78 = function.call @XOR_0::@XOR_0::@compute(%76, %77) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %71[@comp] = %78 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %79 = cast.toindex %5 : !felt.type<"babybear"> + %80 = cast.toindex %12 : !felt.type<"babybear"> + %81 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = felt.add %81, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %83 = cast.toindex %82 : !felt.type<"babybear"> + array.write %array_10[%79, %80, %c0, %83] = %71 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %75 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %75 : !felt.type<"babybear"> + } + %44 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %44, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %42#0, %42#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %42 = bool.cmp lt(%arg14, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + %43:2 = scf.if %42 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %44:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %45 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%45) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %45 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %47 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%47) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %47 = cast.toindex %5 : !felt.type<"babybear"> + %48 = cast.toindex %12 : !felt.type<"babybear"> + %49 = cast.toindex %arg14 : !felt.type<"babybear"> + %50 = array.read %array_6[%47, %48, %49] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %52 = struct.readm %51[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> + %53 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = felt.add %53, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %55 = felt.sub %54, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = cast.toindex %55 : !felt.type<"babybear"> + %57 = array.read %52[%56] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = cast.toindex %5 : !felt.type<"babybear"> + %59 = cast.toindex %12 : !felt.type<"babybear"> + %60 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = cast.toindex %60 : !felt.type<"babybear"> + %62 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = felt.add %62, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = cast.toindex %63 : !felt.type<"babybear"> + %65 = array.read %array_11[%58, %59, %61, %64] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %65[@b] = %57 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %66 = cast.toindex %5 : !felt.type<"babybear"> + %67 = cast.toindex %12 : !felt.type<"babybear"> + %68 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %68 : !felt.type<"babybear"> + %70 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %71 = felt.add %70, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = cast.toindex %71 : !felt.type<"babybear"> + array.write %array_11[%66, %67, %69, %72] = %65 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %73 = cast.toindex %5 : !felt.type<"babybear"> + %74 = cast.toindex %12 : !felt.type<"babybear"> + %75 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %76 = cast.toindex %75 : !felt.type<"babybear"> + %77 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %78 = felt.add %77, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %79 = cast.toindex %78 : !felt.type<"babybear"> + %80 = array.read %array_10[%73, %74, %76, %79] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %81 = pod.read %80[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %82 = arith.subi %81, %c1 : index + pod.write %80[@count] = %82 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %83 = arith.cmpi eq, %82, %c0 : index + scf.if %83 { + %118 = pod.read %65[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %119 = pod.read %65[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %120 = function.call @XOR_0::@XOR_0::@compute(%118, %119) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %80[@comp] = %120 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %121 = cast.toindex %5 : !felt.type<"babybear"> + %122 = cast.toindex %12 : !felt.type<"babybear"> + %123 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %124 = cast.toindex %123 : !felt.type<"babybear"> + %125 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %126 = felt.add %125, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %127 = cast.toindex %126 : !felt.type<"babybear"> + array.write %array_10[%121, %122, %124, %127] = %80 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %84 = cast.toindex %5 : !felt.type<"babybear"> + %85 = cast.toindex %12 : !felt.type<"babybear"> + %86 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %87 = cast.toindex %86 : !felt.type<"babybear"> + %88 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = felt.add %88, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %90 = cast.toindex %89 : !felt.type<"babybear"> + %91 = array.read %array_10[%84, %85, %87, %90] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %92 = pod.read %91[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %93 = struct.readm %92[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %94 = cast.toindex %5 : !felt.type<"babybear"> + %95 = cast.toindex %12 : !felt.type<"babybear"> + %96 = cast.toindex %arg14 : !felt.type<"babybear"> + %97 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %98 = felt.add %97, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %99 = cast.toindex %98 : !felt.type<"babybear"> + %100 = array.read %array_11[%94, %95, %96, %99] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %100[@a] = %93 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %101 = cast.toindex %5 : !felt.type<"babybear"> + %102 = cast.toindex %12 : !felt.type<"babybear"> + %103 = cast.toindex %arg14 : !felt.type<"babybear"> + %104 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %105 = felt.add %104, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %106 = cast.toindex %105 : !felt.type<"babybear"> + array.write %array_11[%101, %102, %103, %106] = %100 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %107 = cast.toindex %5 : !felt.type<"babybear"> + %108 = cast.toindex %12 : !felt.type<"babybear"> + %109 = cast.toindex %arg14 : !felt.type<"babybear"> + %110 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %111 = felt.add %110, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = cast.toindex %111 : !felt.type<"babybear"> + %113 = array.read %array_10[%107, %108, %109, %112] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %114 = pod.read %113[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %115 = arith.subi %114, %c1 : index + pod.write %113[@count] = %115 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %116 = arith.cmpi eq, %115, %c0 : index + scf.if %116 { + %118 = pod.read %100[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %119 = pod.read %100[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %120 = function.call @XOR_0::@XOR_0::@compute(%118, %119) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %113[@comp] = %120 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %121 = cast.toindex %5 : !felt.type<"babybear"> + %122 = cast.toindex %12 : !felt.type<"babybear"> + %123 = cast.toindex %arg14 : !felt.type<"babybear"> + %124 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %125 = felt.add %124, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %126 = cast.toindex %125 : !felt.type<"babybear"> + array.write %array_10[%121, %122, %123, %126] = %113 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %117 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %117 : !felt.type<"babybear"> + } + %46 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %46, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %44#0, %44#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %44:2 = scf.while (%arg17 = %arg15, %arg18 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %45 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%45) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %45 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %47 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%47) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %47 = cast.toindex %5 : !felt.type<"babybear"> + %48 = cast.toindex %12 : !felt.type<"babybear"> + %49 = array.read %array_6[%47, %48, %c3] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %50 = pod.read %49[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %51 = struct.readm %50[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> + %52 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = felt.add %52, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = felt.sub %53, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %55 = cast.toindex %54 : !felt.type<"babybear"> + %56 = array.read %51[%55] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = cast.toindex %5 : !felt.type<"babybear"> + %58 = cast.toindex %12 : !felt.type<"babybear"> + %59 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %60 = felt.add %59, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = cast.toindex %60 : !felt.type<"babybear"> + %62 = array.read %array_11[%57, %58, %c2, %61] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %62[@b] = %56 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %63 = cast.toindex %5 : !felt.type<"babybear"> + %64 = cast.toindex %12 : !felt.type<"babybear"> + %65 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = felt.add %65, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %67 = cast.toindex %66 : !felt.type<"babybear"> + array.write %array_11[%63, %64, %c2, %67] = %62 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %68 = cast.toindex %5 : !felt.type<"babybear"> + %69 = cast.toindex %12 : !felt.type<"babybear"> + %70 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %71 = felt.add %70, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = cast.toindex %71 : !felt.type<"babybear"> + %73 = array.read %array_10[%68, %69, %c2, %72] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %74 = pod.read %73[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %75 = arith.subi %74, %c1 : index + pod.write %73[@count] = %75 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %76 = arith.cmpi eq, %75, %c0 : index + scf.if %76 { + %106 = pod.read %62[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %107 = pod.read %62[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %108 = function.call @XOR_0::@XOR_0::@compute(%106, %107) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %73[@comp] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %109 = cast.toindex %5 : !felt.type<"babybear"> + %110 = cast.toindex %12 : !felt.type<"babybear"> + %111 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = felt.add %111, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %113 = cast.toindex %112 : !felt.type<"babybear"> + array.write %array_10[%109, %110, %c2, %113] = %73 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %77 = cast.toindex %5 : !felt.type<"babybear"> + %78 = cast.toindex %12 : !felt.type<"babybear"> + %79 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = felt.add %79, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %81 = cast.toindex %80 : !felt.type<"babybear"> + %82 = array.read %array_10[%77, %78, %c2, %81] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %84 = struct.readm %83[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %85 = cast.toindex %5 : !felt.type<"babybear"> + %86 = cast.toindex %12 : !felt.type<"babybear"> + %87 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %88 = felt.add %87, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = cast.toindex %88 : !felt.type<"babybear"> + %90 = array.read %array_1[%85, %86, %89] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %90[@a] = %84 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %91 = cast.toindex %5 : !felt.type<"babybear"> + %92 = cast.toindex %12 : !felt.type<"babybear"> + %93 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = felt.add %93, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %95 = cast.toindex %94 : !felt.type<"babybear"> + array.write %array_1[%91, %92, %95] = %90 : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %96 = cast.toindex %5 : !felt.type<"babybear"> + %97 = cast.toindex %12 : !felt.type<"babybear"> + %98 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %99 = felt.add %98, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %100 = cast.toindex %99 : !felt.type<"babybear"> + %101 = array.read %array[%96, %97, %100] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %102 = pod.read %101[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %103 = arith.subi %102, %c1 : index + pod.write %101[@count] = %103 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %104 = arith.cmpi eq, %103, %c0 : index + scf.if %104 { + %106 = pod.read %90[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %107 = pod.read %90[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %108 = function.call @XOR_0::@XOR_0::@compute(%106, %107) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %101[@comp] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %109 = cast.toindex %5 : !felt.type<"babybear"> + %110 = cast.toindex %12 : !felt.type<"babybear"> + %111 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = felt.add %111, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + %113 = cast.toindex %112 : !felt.type<"babybear"> + array.write %array[%109, %110, %113] = %101 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %105 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %105 : !felt.type<"babybear"> + } + %46 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %45, %46 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %44#1, %44#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %43#0, %43#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %41 = felt.add %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %40#0, %41, %40#1, %24 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %13#0, %13#1, %13#2, %13#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %9 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %10 = scf.for %arg8 = %7 to %8 step %9 iter_args(%arg9 = %6#0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %13 = bool.cmp lt(%12, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %16 = bool.cmp lt(%arg10, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%16) %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %16 = felt.add %12, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.mul %16, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %arg1[%19] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %5 : !felt.type<"babybear"> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = cast.toindex %arg10 : !felt.type<"babybear"> + %24 = array.read %array_1[%21, %22, %23] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %24[@b] = %20 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %25 = cast.toindex %5 : !felt.type<"babybear"> + %26 = cast.toindex %12 : !felt.type<"babybear"> + %27 = cast.toindex %arg10 : !felt.type<"babybear"> + array.write %array_1[%25, %26, %27] = %24 : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = cast.toindex %5 : !felt.type<"babybear"> + %29 = cast.toindex %12 : !felt.type<"babybear"> + %30 = cast.toindex %arg10 : !felt.type<"babybear"> + %31 = array.read %array[%28, %29, %30] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %44 = pod.read %24[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %45 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %46 = function.call @XOR_0::@XOR_0::@compute(%44, %45) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %31[@comp] = %46 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %47 = cast.toindex %5 : !felt.type<"babybear"> + %48 = cast.toindex %12 : !felt.type<"babybear"> + %49 = cast.toindex %arg10 : !felt.type<"babybear"> + array.write %array[%47, %48, %49] = %31 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %35 = cast.toindex %5 : !felt.type<"babybear"> + %36 = cast.toindex %12 : !felt.type<"babybear"> + %37 = cast.toindex %arg10 : !felt.type<"babybear"> + %38 = array.read %array[%35, %36, %37] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %40 = struct.readm %39[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %41 = cast.toindex %12 : !felt.type<"babybear"> + %42 = cast.toindex %arg10 : !felt.type<"babybear"> + array.write %nondet_18[%41, %42] = %40 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %43 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %43 : !felt.type<"babybear"> + } + %15 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %14 : !felt.type<"babybear"> + } + %11 = felt.add %arg6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6#2, %6#3, %6#1, %11, %10 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %nondet_22 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + array.write %nondet_22[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_22[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %0#2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = bool.cmp lt(%10, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %23 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%23) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = felt.sub %25, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %nondet_18[%23, %27] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = felt.add %29, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %array_3[%31] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %33 = pod.read %32[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %34 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %33[%34] = %28 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.add %35, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = cast.toindex %36 : !felt.type<"babybear"> + %38 = array.read %array_3[%37] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + pod.write %38[@in] = %33 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %39 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %39, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %40 : !felt.type<"babybear"> + array.write %array_3[%41] = %38 : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %42 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %43 : !felt.type<"babybear"> + %45 = array.read %array_2[%44] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + %46 = pod.read %45[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index + %47 = arith.subi %46, %c1 : index + pod.write %45[@count] = %47 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index + %48 = arith.cmpi eq, %47, %c0 : index + scf.if %48 { + %50 = pod.read %38[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %51 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%50) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + pod.write %45[@comp] = %51 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %52 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = felt.add %52, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = cast.toindex %53 : !felt.type<"babybear"> + array.write %array_2[%54] = %45 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + } + %49 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %49 : !felt.type<"babybear"> + } + %13 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %array_2[%15] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %18 = struct.readm %17[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + %19 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %19, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + array.write %nondet_22[%21] = %18 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12 : !felt.type<"babybear"> + } + scf.yield %9 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %nondet_22[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_15[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %9 = cast.toindex %5 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_15[@in] = %8 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %10 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_14[@count] = %11 : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %13 = pod.read %pod_15[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %14 = function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@compute(%13) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + pod.write %pod_14[@comp] = %14 : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + } + } + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + %7 = struct.readm %6[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %7[%8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %pod_0[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %11 = cast.toindex %5 : !felt.type<"babybear"> + array.write %10[%11] = %9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %10 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.subi %12, %c1 : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.cmpi eq, %13, %c0 : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %16 = function.call @EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4::@compute(%15) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + } + } + %2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %1) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = bool.cmp lt(%10, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + %13 = struct.readm %12[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> + %14 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %13[%16] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.add %18, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %array_9[%20] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %21[@in] = %17 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = felt.add %22, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %23 : !felt.type<"babybear"> + array.write %array_9[%24] = %21 : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %25 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = felt.add %25, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %array_8[%27] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %30 = arith.subi %29, %c1 : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.cmpi eq, %30, %c0 : index + scf.if %31 { + %34 = pod.read %21[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %35 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%34) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + pod.write %28[@comp] = %35 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %36 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.add %36, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = cast.toindex %37 : !felt.type<"babybear"> + array.write %array_8[%38] = %28 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + } + %32 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %34 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%34) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %34 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.add %34, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %array_8[%36] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %39 = struct.readm %38[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> + %40 = felt.sub %felt_const_7, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %40 : !felt.type<"babybear"> + %42 = array.read %39[%41] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %43 = cast.toindex %5 : !felt.type<"babybear"> + %44 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = felt.add %44, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = cast.toindex %45 : !felt.type<"babybear"> + array.write %nondet_18[%43, %46] = %42 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %47 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %47 : !felt.type<"babybear"> + } + %33 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %32 : !felt.type<"babybear"> + } + scf.yield %9 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %nondet_18[%11, %12] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %array_13[%14, %15] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %16[@a] = %13 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = cast.toindex %5 : !felt.type<"babybear"> + %18 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_13[%17, %18] = %16 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = cast.toindex %5 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %array_12[%19, %20] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %49 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @XOR_0::@XOR_0::@compute(%49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %21[@comp] = %51 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %52 = cast.toindex %5 : !felt.type<"babybear"> + %53 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_12[%52, %53] = %21 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %25 = felt.add %5, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = felt.mul %25, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = felt.add %26, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %27 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = cast.toindex %5 : !felt.type<"babybear"> + %31 = cast.toindex %9 : !felt.type<"babybear"> + %32 = array.read %array_13[%30, %31] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %33 = cast.toindex %5 : !felt.type<"babybear"> + %34 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_13[%33, %34] = %32 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %35 = cast.toindex %5 : !felt.type<"babybear"> + %36 = cast.toindex %9 : !felt.type<"babybear"> + %37 = array.read %array_12[%35, %36] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %49 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @XOR_0::@XOR_0::@compute(%49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %52 = cast.toindex %5 : !felt.type<"babybear"> + %53 = cast.toindex %9 : !felt.type<"babybear"> + array.write %array_12[%52, %53] = %37 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %41 = cast.toindex %5 : !felt.type<"babybear"> + %42 = cast.toindex %9 : !felt.type<"babybear"> + %43 = array.read %array_12[%41, %42] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %45 = struct.readm %44[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %46 = cast.toindex %5 : !felt.type<"babybear"> + %47 = cast.toindex %9 : !felt.type<"babybear"> + array.write %nondet_18[%46, %47] = %45 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %nondet_18[%11, %12] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.mul %5, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + array.write %nondet[%16] = %13 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + struct.writem %self[@xor_3$inputs] = %array_1 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_23 = array.new : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %5 = array.read %array[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + array.write %array_23[%arg2, %arg3, %arg4] = %6 : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + } + } + } + struct.writem %self[@xor_3] = %array_23 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.writem %self[@num2bits_2$inputs] = %array_9 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_24 = array.new : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_8[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + array.write %array_24[%arg2] = %6 : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + struct.writem %self[@num2bits_2] = %array_24 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> + struct.writem %self[@num2bits_1$inputs] = %array_7 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_25 = array.new : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array_6[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + array.write %array_25[%arg2, %arg3, %arg4] = %6 : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + } + } + struct.writem %self[@num2bits_1] = %array_25 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.writem %self[@bits2num_2$inputs] = %array_3 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + %array_26 = array.new : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_2[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + array.write %array_26[%arg2] = %6 : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + struct.writem %self[@bits2num_2] = %array_26 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + struct.writem %self[@xor_2$inputs] = %array_11 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_27 = array.new : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %5 = array.read %array_10[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + array.write %array_27[%arg2, %arg3, %arg4, %arg5] = %6 : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + } + } + } + } + struct.writem %self[@xor_2] = %array_27 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.writem %self[@xor_1$inputs] = %array_5 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_28 = array.new : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_4[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + array.write %array_28[%arg2, %arg3] = %6 : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + } + } + struct.writem %self[@xor_1] = %array_28 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.writem %self[@xor_4$inputs] = %array_13 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_29 = array.new : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_12[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + array.write %array_29[%arg2, %arg3] = %6 : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + } + } + struct.writem %self[@xor_4] = %array_29 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.writem %self[@row_shifting$inputs] = %pod_15 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + %3 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + struct.writem %self[@row_shifting] = %3 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + struct.writem %self[@bits2num_1$inputs] = %array_17 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + %array_30 = array.new : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array_16[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + array.write %array_30[%arg2, %arg3, %arg4] = %6 : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + } + } + struct.writem %self[@bits2num_1] = %array_30 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + struct.writem %self[@sub_bytes$inputs] = %pod_0 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + struct.writem %self[@sub_bytes] = %4 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + struct.writem %self[@out] = %nondet : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> + function.return %self : !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, %arg1: !array.type<128 x !felt.type<"babybear">>, %arg2: !array.type<1920 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c16 = arith.constant 16 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c32 = arith.constant 32 : index + %c4 = arith.constant 4 : index + %c13 = arith.constant 13 : index + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_32 = felt.const 32 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@sub_bytes] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + %2 = struct.readm %arg0[@sub_bytes$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@xor_3] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + %4 = struct.readm %arg0[@xor_3$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %5 = struct.readm %arg0[@bits2num_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + %6 = struct.readm %arg0[@bits2num_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + %7 = struct.readm %arg0[@xor_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + %8 = struct.readm %arg0[@xor_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %9 = struct.readm %arg0[@num2bits_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + %10 = struct.readm %arg0[@num2bits_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> + %11 = struct.readm %arg0[@num2bits_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> + %12 = struct.readm %arg0[@num2bits_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> + %13 = struct.readm %arg0[@xor_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + %14 = struct.readm %arg0[@xor_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %15 = struct.readm %arg0[@xor_4] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + %16 = struct.readm %arg0[@xor_4$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %17 = struct.readm %arg0[@row_shifting] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + %18 = struct.readm %arg0[@row_shifting$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + %19 = struct.readm %arg0[@bits2num_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + %20 = struct.readm %arg0[@bits2num_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + %nondet = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet[%c2] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet[%c3] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet_1[%c0] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_1[%c1] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_1[%c2] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + array.insert %nondet_1[%c3] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c4 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %27 to %28 step %29 { + %30 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %31 = bool.cmp lt(%30, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.mul %26, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = felt.add %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + %35 = array.read %arg1[%34] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = cast.toindex %26 : !felt.type<"babybear"> + %37 = cast.toindex %30 : !felt.type<"babybear"> + %38 = array.read %8[%36, %37] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %39 = pod.read %38[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %26, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %40, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %41, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %42 : !felt.type<"babybear"> + %44 = array.read %arg2[%43] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> + %45 = cast.toindex %26 : !felt.type<"babybear"> + %46 = cast.toindex %30 : !felt.type<"babybear"> + %47 = array.read %8[%45, %46] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %48 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %48, %44 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = cast.toindex %26 : !felt.type<"babybear"> + %50 = cast.toindex %30 : !felt.type<"babybear"> + %51 = array.read %7[%49, %50] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %52 = struct.readm %51[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %53 = cast.toindex %26 : !felt.type<"babybear"> + %54 = cast.toindex %30 : !felt.type<"babybear"> + array.write %nondet[%53, %54] = %52 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + %21:5 = scf.for %arg3 = %c0 to %c13 step %c1 iter_args(%arg4 = %felt_const_0, %arg5 = %felt_const_4, %arg6 = %felt_const_0, %arg7 = %felt_const_0, %arg8 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27:4 = scf.for %arg9 = %c0 to %c4 step %c1 iter_args(%arg10 = %arg8, %arg11 = %arg6, %arg12 = %arg7, %arg13 = %arg4) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %33 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %34:4 = scf.while (%arg14 = %felt_const_0, %arg15 = %arg10, %arg16 = %arg11, %arg17 = %arg13) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %35 = bool.cmp lt(%arg14, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%35) %arg14, %arg15, %arg16, %arg17 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg14: !felt.type<"babybear">, %arg15: !felt.type<"babybear">, %arg16: !felt.type<"babybear">, %arg17: !felt.type<"babybear">): + %nondet_4 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = felt.add %33, %arg14 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.umod %35, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = cast.toindex %36 : !felt.type<"babybear"> + %38 = array.extract %nondet[%37] : <4,32 x !felt.type<"babybear">> + scf.for %arg18 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg18 : index, !felt.type<"babybear"> + %49 = felt.mul %arg14, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %50 = felt.add %49, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = felt.sub %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> + %52 = cast.toindex %51 : !felt.type<"babybear"> + %53 = array.read %38[%52] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = cast.toindex %26 : !felt.type<"babybear"> + %55 = cast.toindex %33 : !felt.type<"babybear"> + %56 = cast.toindex %arg14 : !felt.type<"babybear"> + %57 = array.read %20[%54, %55, %56] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %58 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %59 = cast.toindex %48 : !felt.type<"babybear"> + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %60, %53 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %39 = cast.toindex %26 : !felt.type<"babybear"> + %40 = cast.toindex %33 : !felt.type<"babybear"> + %41 = cast.toindex %arg14 : !felt.type<"babybear"> + %42 = array.read %19[%39, %40, %41] : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %43 = struct.readm %42[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + %44 = function.call @emulated_aesenc_enc_table_1(%arg14, %43) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> + %45 = bool.cmp eq(%arg14, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %46:2 = scf.if %45 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %48:2 = scf.while (%arg18 = %felt_const_0, %arg19 = %arg16) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %49 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%49) %arg18, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg18: !felt.type<"babybear">, %arg19: !felt.type<"babybear">): + %49 = scf.while (%arg20 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %51 = bool.cmp lt(%arg20, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%51) %arg20 : !felt.type<"babybear"> + } do { + ^bb0(%arg20: !felt.type<"babybear">): + %51 = cast.toindex %26 : !felt.type<"babybear"> + %52 = cast.toindex %33 : !felt.type<"babybear"> + %53 = array.read %9[%51, %52, %c0] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %54 = struct.readm %53[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> + %55 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = felt.add %55, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = felt.sub %56, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %58 = cast.toindex %57 : !felt.type<"babybear"> + %59 = array.read %54[%58] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = cast.toindex %26 : !felt.type<"babybear"> + %61 = cast.toindex %33 : !felt.type<"babybear"> + %62 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = felt.add %62, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = cast.toindex %63 : !felt.type<"babybear"> + %65 = array.read %14[%60, %61, %c0, %64] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %66 = pod.read %65[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %66, %59 : !felt.type<"babybear">, !felt.type<"babybear"> + %67 = felt.add %arg20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %67 : !felt.type<"babybear"> + } + %50 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %50, %49 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %48#1, %48#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %48 = bool.cmp lt(%arg14, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + %49:2 = scf.if %48 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %50:2 = scf.while (%arg18 = %arg16, %arg19 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %51 = bool.cmp lt(%arg19, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%51) %arg18, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg18: !felt.type<"babybear">, %arg19: !felt.type<"babybear">): + %51 = scf.while (%arg20 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %53 = bool.cmp lt(%arg20, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%53) %arg20 : !felt.type<"babybear"> + } do { + ^bb0(%arg20: !felt.type<"babybear">): + %53 = cast.toindex %26 : !felt.type<"babybear"> + %54 = cast.toindex %33 : !felt.type<"babybear"> + %55 = cast.toindex %arg14 : !felt.type<"babybear"> + %56 = array.read %9[%53, %54, %55] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %57 = struct.readm %56[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> + %58 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = felt.add %58, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %60 = felt.sub %59, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = cast.toindex %60 : !felt.type<"babybear"> + %62 = array.read %57[%61] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %63 = cast.toindex %26 : !felt.type<"babybear"> + %64 = cast.toindex %33 : !felt.type<"babybear"> + %65 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = cast.toindex %65 : !felt.type<"babybear"> + %67 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = felt.add %67, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %68 : !felt.type<"babybear"> + %70 = array.read %14[%63, %64, %66, %69] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %71 = pod.read %70[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %71, %62 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = cast.toindex %26 : !felt.type<"babybear"> + %73 = cast.toindex %33 : !felt.type<"babybear"> + %74 = felt.sub %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %77 = felt.add %76, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %78 = cast.toindex %77 : !felt.type<"babybear"> + %79 = array.read %13[%72, %73, %75, %78] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %80 = struct.readm %79[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %81 = cast.toindex %26 : !felt.type<"babybear"> + %82 = cast.toindex %33 : !felt.type<"babybear"> + %83 = cast.toindex %arg14 : !felt.type<"babybear"> + %84 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %85 = felt.add %84, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %86 = cast.toindex %85 : !felt.type<"babybear"> + %87 = array.read %14[%81, %82, %83, %86] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %88 = pod.read %87[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %88, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = felt.add %arg20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %89 : !felt.type<"babybear"> + } + %52 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %51, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %50#0, %50#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %50:2 = scf.while (%arg18 = %arg16, %arg19 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %51 = bool.cmp lt(%arg19, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%51) %arg18, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg18: !felt.type<"babybear">, %arg19: !felt.type<"babybear">): + %51 = scf.while (%arg20 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %53 = bool.cmp lt(%arg20, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%53) %arg20 : !felt.type<"babybear"> + } do { + ^bb0(%arg20: !felt.type<"babybear">): + %53 = cast.toindex %26 : !felt.type<"babybear"> + %54 = cast.toindex %33 : !felt.type<"babybear"> + %55 = array.read %9[%53, %54, %c3] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %56 = struct.readm %55[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> + %57 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %58 = felt.add %57, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = felt.sub %58, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %60 = cast.toindex %59 : !felt.type<"babybear"> + %61 = array.read %56[%60] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %62 = cast.toindex %26 : !felt.type<"babybear"> + %63 = cast.toindex %33 : !felt.type<"babybear"> + %64 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %65 = felt.add %64, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = cast.toindex %65 : !felt.type<"babybear"> + %67 = array.read %14[%62, %63, %c2, %66] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %68 = pod.read %67[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %68, %61 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %26 : !felt.type<"babybear"> + %70 = cast.toindex %33 : !felt.type<"babybear"> + %71 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = felt.add %71, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %73 = cast.toindex %72 : !felt.type<"babybear"> + %74 = array.read %13[%69, %70, %c2, %73] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %75 = struct.readm %74[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %76 = cast.toindex %26 : !felt.type<"babybear"> + %77 = cast.toindex %33 : !felt.type<"babybear"> + %78 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %79 = felt.add %78, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = cast.toindex %79 : !felt.type<"babybear"> + %81 = array.read %4[%76, %77, %80] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %82 = pod.read %81[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %82, %75 : !felt.type<"babybear">, !felt.type<"babybear"> + %83 = felt.add %arg20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %83 : !felt.type<"babybear"> + } + %52 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %51, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %50#0, %50#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %49#0, %49#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %47 = felt.add %arg14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %47, %44, %46#0, %46#1 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %34#1, %34#2, %34#0, %34#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %28 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %30 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %31 = scf.for %arg9 = %28 to %29 step %30 iter_args(%arg10 = %27#3) -> (!felt.type<"babybear">) { + %33 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %34 = bool.cmp lt(%33, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = scf.while (%arg11 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %37 = bool.cmp lt(%arg11, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%37) %arg11 : !felt.type<"babybear"> + } do { + ^bb0(%arg11: !felt.type<"babybear">): + %37 = felt.add %33, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.add %38, %arg11 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = cast.toindex %39 : !felt.type<"babybear"> + %41 = array.read %arg2[%40] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = cast.toindex %26 : !felt.type<"babybear"> + %43 = cast.toindex %33 : !felt.type<"babybear"> + %44 = cast.toindex %arg11 : !felt.type<"babybear"> + %45 = array.read %4[%42, %43, %44] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %46 = pod.read %45[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %46, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = cast.toindex %26 : !felt.type<"babybear"> + %48 = cast.toindex %33 : !felt.type<"babybear"> + %49 = cast.toindex %arg11 : !felt.type<"babybear"> + %50 = array.read %3[%47, %48, %49] : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %51 = struct.readm %50[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %52 = cast.toindex %33 : !felt.type<"babybear"> + %53 = cast.toindex %arg11 : !felt.type<"babybear"> + array.write %nondet[%52, %53] = %51 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = felt.add %arg11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %54 : !felt.type<"babybear"> + } + %36 = felt.add %33, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %35 : !felt.type<"babybear"> + } + %32 = felt.add %arg5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %31, %32, %27#1, %27#2, %27#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %nondet_3 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %21#3) -> (!felt.type<"babybear">) { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %30 = scf.for %arg5 = %27 to %28 step %29 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %32 = bool.cmp lt(%31, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %43 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%43) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %43 = cast.toindex %26 : !felt.type<"babybear"> + %44 = felt.mul %31, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = felt.add %44, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = felt.sub %45, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = cast.toindex %46 : !felt.type<"babybear"> + %48 = array.read %nondet[%43, %47] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %50 = felt.add %49, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = cast.toindex %50 : !felt.type<"babybear"> + %52 = array.read %6[%51] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %53 = pod.read %52[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + %54 = cast.toindex %arg7 : !felt.type<"babybear"> + %55 = array.read %53[%54] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %55, %48 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %56 : !felt.type<"babybear"> + } + %34 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.add %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %5[%36] : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %38 = struct.readm %37[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + %39 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %39, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %40 : !felt.type<"babybear"> + array.write %nondet_3[%41] = %38 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.add %31, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %33 : !felt.type<"babybear"> + } + scf.yield %30 : !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %nondet_3[%27] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = pod.read %18[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %30 = cast.toindex %26 : !felt.type<"babybear"> + %31 = array.read %29[%30] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = struct.readm %17[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> + %28 = cast.toindex %26 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %2[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + %31 = cast.toindex %26 : !felt.type<"babybear"> + %32 = array.read %30[%31] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %23 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %22) -> (!felt.type<"babybear">) { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %30 = scf.for %arg5 = %27 to %28 step %29 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %32 = bool.cmp lt(%31, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = struct.readm %1[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> + %34 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.add %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %33[%36] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.add %38, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = cast.toindex %39 : !felt.type<"babybear"> + %41 = array.read %12[%40] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %42 = pod.read %41[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %42, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %45 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%45) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %45 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = felt.add %45, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = cast.toindex %46 : !felt.type<"babybear"> + %48 = array.read %11[%47] : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %49 = struct.readm %48[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> + %50 = felt.sub %felt_const_7, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = cast.toindex %50 : !felt.type<"babybear"> + %52 = array.read %49[%51] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %53 = cast.toindex %26 : !felt.type<"babybear"> + %54 = felt.mul %31, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %55 = felt.add %54, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = cast.toindex %55 : !felt.type<"babybear"> + array.write %nondet[%53, %56] = %52 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %57 : !felt.type<"babybear"> + } + %44 = felt.add %31, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %43 : !felt.type<"babybear"> + } + scf.yield %30 : !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %27 to %28 step %29 { + %30 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %31 = bool.cmp lt(%30, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %26 : !felt.type<"babybear"> + %33 = cast.toindex %30 : !felt.type<"babybear"> + %34 = array.read %nondet[%32, %33] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = cast.toindex %26 : !felt.type<"babybear"> + %36 = cast.toindex %30 : !felt.type<"babybear"> + %37 = array.read %16[%35, %36] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %38 = pod.read %37[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.add %26, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.mul %39, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.add %40, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = cast.toindex %41 : !felt.type<"babybear"> + %43 = array.read %arg2[%42] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %26 : !felt.type<"babybear"> + %45 = cast.toindex %30 : !felt.type<"babybear"> + %46 = array.read %16[%44, %45] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %47 = pod.read %46[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %47, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %48 = cast.toindex %26 : !felt.type<"babybear"> + %49 = cast.toindex %30 : !felt.type<"babybear"> + %50 = array.read %15[%48, %49] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %51 = struct.readm %50[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %52 = cast.toindex %26 : !felt.type<"babybear"> + %53 = cast.toindex %30 : !felt.type<"babybear"> + array.write %nondet[%52, %53] = %51 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %27 to %28 step %29 { + %30 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %31 = bool.cmp lt(%30, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %26 : !felt.type<"babybear"> + %33 = cast.toindex %30 : !felt.type<"babybear"> + %34 = array.read %nondet[%32, %33] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = felt.mul %26, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.add %35, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = cast.toindex %36 : !felt.type<"babybear"> + %38 = array.read %0[%37] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %26 = array.read %3[%arg3, %arg4, %arg5] : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %27 = array.read %4[%arg3, %arg4, %arg5] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + } + } + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = array.read %11[%arg3] : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %27 = array.read %12[%arg3] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%26, %28) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () + } + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %26 = array.read %9[%arg3, %arg4, %arg5] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %27 = array.read %10[%arg3, %arg4, %arg5] : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%26, %28) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + } + } + } + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = array.read %5[%arg3] : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %27 = array.read %6[%arg3] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %28 = pod.read %27[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%26, %28) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () + } + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c32 step %c1 { + %26 = array.read %13[%arg3, %arg4, %arg5, %arg6] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %27 = array.read %14[%arg3, %arg4, %arg5, %arg6] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + } + } + } + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %26 = array.read %7[%arg3, %arg4] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %27 = array.read %8[%arg3, %arg4] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + } + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %26 = array.read %15[%arg3, %arg4] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %27 = array.read %16[%arg3, %arg4] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + } + %24 = pod.read %18[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@constrain(%17, %24) : (!struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %26 = array.read %19[%arg3, %arg4, %arg5] : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %27 = array.read %20[%arg3, %arg4, %arg5] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> + %28 = pod.read %27[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%26, %28) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () + } + } + } + %25 = pod.read %2[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> + function.call @EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4::@constrain(%1, %25) : (!struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Bits2Num_7 { + struct.def @Bits2Num_7 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %6, %7, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#0 : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> + } + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#0 : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AES256CTR_8 { + struct.def @AES256CTR_8 { + struct.member @out : !array.type<128 x !felt.type<"babybear">> {llzk.pub} + struct.member @aes_256_encrypt_1 : !array.type<1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> + struct.member @aes_256_encrypt_1$inputs : !array.type<1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> + struct.member @bits2num_1 : !array.type<1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> + struct.member @bits2num_1$inputs : !array.type<1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> + struct.member @num2bits_1 : !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @num2bits_1$inputs : !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @xor_1 : !array.type<1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_1$inputs : !array.type<1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<128 x !felt.type<"babybear">>, %arg1: !array.type<128 x !felt.type<"babybear">>, %arg2: !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256CTR_8::@AES256CTR_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1920 = arith.constant 1920 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c3 = arith.constant 3 : index + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c2048 = arith.constant {product_source = "compute"} 2048 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@AES256CTR_8::@AES256CTR_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c2048 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_0 = array.new : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %1 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %1[@count] = %c32 : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%c0] = %1 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_2 = array.new : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %2 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%c0] = %2 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_4 = array.new : <1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %30 = array.read %array_5[%c0, %arg3, %arg4, %arg5] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %30[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%c0, %arg3, %arg4, %arg5] = %30 : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_8 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_8[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<16,8 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_9[%c0] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c1] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c2] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c3] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c4] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c5] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c6] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c7] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c8] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c9] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c10] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c11] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c12] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c13] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c14] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c15] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + %3:2 = scf.while (%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %30 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%30) %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">, %arg4: !felt.type<"babybear">): + scf.for %arg5 = %c0 to %c128 step %c1 { + %48 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %arg1[%49] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %52 = pod.read %51[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53] = %50 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %54[@in] = %52 : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %54 : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %55 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@count] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %55[@count] = %57 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %59 = pod.read %54[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %54[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %61 = function.call @AES256Encrypt_6::@AES256Encrypt_6::@compute(%59, %60) : (!array.type<128 x !felt.type<"babybear">>, !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + pod.write %55[@comp] = %61 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + array.write %array[%c0] = %55 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c1920 step %c1 { + %48 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %arg2[%49] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %52 = pod.read %51[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53] = %50 : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %54[@ks] = %52 : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %54 : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %55 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@count] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %55[@count] = %57 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %59 = pod.read %54[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %54[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %61 = function.call @AES256Encrypt_6::@AES256Encrypt_6::@compute(%59, %60) : (!array.type<128 x !felt.type<"babybear">>, !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + pod.write %55[@comp] = %61 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + array.write %array[%c0] = %55 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %30 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %33:2 = scf.for %arg5 = %c0 to %c4 step %c1 iter_args(%arg6 = %arg4, %arg7 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %48 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %49:2 = scf.while (%arg8 = %arg7, %arg9 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %50 = bool.cmp lt(%arg9, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%50) %arg8, %arg9 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg8: !felt.type<"babybear">, %arg9: !felt.type<"babybear">): + %50 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %52 = bool.cmp lt(%arg10, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%52) %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %52 = felt.mul %48, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.add %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.add %55, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array_6[%c0, %59, %60, %61] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %62[@a] = %58 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0, %63, %64, %65] = %62 : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %66 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %array_5[%c0, %66, %67, %68] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %70 = pod.read %69[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %71 = arith.subi %70, %c1 {product_source = "compute"} : index + pod.write %69[@count] = %71 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %72 = arith.cmpi eq, %71, %c0 {product_source = "compute"} : index + scf.if %72 { + %106 = pod.read %62[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %107 = pod.read %62[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %108 = function.call @XOR_0::@XOR_0::@compute(%106, %107) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %69[@comp] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %109 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %111 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%c0, %109, %110, %111] = %69 : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %73 = felt.mul %48, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %73, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = felt.add %75, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %77 = cast.toindex %76 : !felt.type<"babybear"> {product_source = "compute"} + %78 = array.read %32[%77] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_6[%c0, %79, %80, %81] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %82[@b] = %78 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0, %83, %84, %85] = %82 : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %86 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_5[%c0, %86, %87, %88] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %90 = pod.read %89[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %91 = arith.subi %90, %c1 {product_source = "compute"} : index + pod.write %89[@count] = %91 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.cmpi eq, %91, %c0 {product_source = "compute"} : index + scf.if %92 { + %106 = pod.read %82[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %107 = pod.read %82[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %108 = function.call @XOR_0::@XOR_0::@compute(%106, %107) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %89[@comp] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %109 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %111 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%c0, %109, %110, %111] = %89 : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %93 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %94 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %array_5[%c0, %93, %94, %95] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %97 = pod.read %96[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %99 = felt.mul %48, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %99, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = felt.add %100, %101 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %103 = felt.add %102, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%104] = %98 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %105 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %105 : !felt.type<"babybear"> + } + %51 = felt.add %arg9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %49#1, %49#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %34 = scf.for %arg5 = %c0 to %c4 step %c1 iter_args(%arg6 = %33#0) -> (!felt.type<"babybear">) { + %48 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %49 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %50 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%50) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %50 = felt.mul %48, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %51, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg1[%53] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_2[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %56 = pod.read %55[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %57 = felt.mul %48, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %58 = felt.add %57, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + array.write %56[%59] = %54 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array_2[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %60[@in] = %56 : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_2[%c0] = %60 : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %61 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %66 = pod.read %60[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %67 = function.call @Bits2Num_7::@Bits2Num_7::@product(%66) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> + %68 = function.call @Bits2Num_7::@Bits2Num_7::@compute(%66) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + pod.write %61[@comp] = %67 : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + array.write %array_1[%c0] = %61 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %65 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %65 : !felt.type<"babybear"> + } + scf.yield %49 : !felt.type<"babybear"> + } {product_source = "compute"} + %35 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %37, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_4[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %39[@in] = %38 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%c0] = %39 : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %40 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %48 = pod.read %39[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @Num2Bits_2::@Num2Bits_2::@product(%48) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %50 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%48) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %40[@comp] = %49 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_3[%c0] = %40 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %45 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %46 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %47 = scf.for %arg5 = %44 to %45 step %46 iter_args(%arg6 = %34) -> (!felt.type<"babybear">) { + %48 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %49 = bool.cmp lt(%48, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %52 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%52) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %52 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %53 = pod.read %52[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %54 = struct.readm %53[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %55 = felt.mul %48, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.add %55, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = felt.sub %56, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %54[%58] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = felt.mul %48, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = felt.add %60, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "compute"} + array.write %arg1[%62] = %59 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %63 : !felt.type<"babybear"> + } + %51 = felt.add %48, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %50 : !felt.type<"babybear"> + } + scf.yield %33#1, %47, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@bits2num_1$inputs] = %array_2 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_11 = array.new : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> {product_source = "compute"} + %4 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + array.write %array_11[%c0] = %5 : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + struct.writem %self[@bits2num_1] = %array_11 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_6 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %30 = array.read %array_5[%c0, %arg3, %arg4, %arg5] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_12[%c0, %arg3, %arg4, %arg5] = %31 : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_12 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_1$inputs] = %array_4 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_13 = array.new : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + %6 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_13[%c0] = %7 : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@num2bits_1] = %array_13 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@aes_256_encrypt_1$inputs] = %array_0 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_14 = array.new : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> {product_source = "compute"} + %8 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + array.write %array_14[%c0] = %9 : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + struct.writem %self[@aes_256_encrypt_1] = %array_14 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %10 = struct.readm %self[@out] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = struct.readm %self[@aes_256_encrypt_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> {product_source = "constrain"} + %12 = struct.readm %self[@aes_256_encrypt_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %13 = struct.readm %self[@bits2num_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> {product_source = "constrain"} + %14 = struct.readm %self[@bits2num_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %15 = struct.readm %self[@num2bits_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %16 = struct.readm %self[@num2bits_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %17 = struct.readm %self[@xor_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %18 = struct.readm %self[@xor_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet_15 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_15[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_16 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_16[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_17 = llzk.nondet : !array.type<16,8 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_18 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_18[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_17[%c0] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c1] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c2] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c3] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c4] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c5] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c6] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c7] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c8] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c9] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c10] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c11] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c12] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c13] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c14] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c15] = %nondet_18 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + %19:2 = scf.while (%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %30 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%30) %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">, %arg4: !felt.type<"babybear">): + scf.for %arg5 = %c0 to %c128 step %c1 { + %43 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg1[%44] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %12[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = pod.read %46[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c1920 step %c1 { + %43 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg2[%44] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %12[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = pod.read %46[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = array.read %11[%c0] : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "constrain"} + %31 = struct.readm %30[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %32:2 = scf.for %arg5 = %c0 to %c4 step %c1 iter_args(%arg6 = %arg4, %arg7 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %43 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44:2 = scf.while (%arg8 = %arg6, %arg9 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %45 = bool.cmp lt(%arg9, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%45) {product_source = "constrain"} %arg8, %arg9 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg8: !felt.type<"babybear">, %arg9: !felt.type<"babybear">): + %45 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %47 = bool.cmp lt(%arg10, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%47) {product_source = "constrain"} %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %47 = felt.mul %43, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %47, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %arg0[%52] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %18[%c0, %54, %55, %56] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %58 = pod.read %57[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %58, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = felt.mul %43, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = felt.add %59, %60 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.add %61, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %31[%63] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %18[%c0, %65, %66, %67] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %69 = pod.read %68[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %69, %64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %17[%c0, %70, %71, %72] : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %74 = struct.readm %73[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = felt.mul %43, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %76 = felt.add %75, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %77 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %78 = felt.add %76, %77 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %79 = felt.add %78, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %10[%80] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %81, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %82 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %82 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %46 = felt.add %arg9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %45, %46 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %44#0, %44#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %33 = scf.for %arg5 = %c0 to %c4 step %c1 iter_args(%arg6 = %32#1) -> (!felt.type<"babybear">) { + %43 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %45 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%45) {product_source = "constrain"} %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %45 = felt.mul %43, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.sub %46, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg1[%48] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %14[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = pod.read %50[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = felt.mul %43, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %51[%54] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %56 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %44 : !felt.type<"babybear"> + } {product_source = "constrain"} + %34 = array.read %13[%c0] : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "constrain"} + %35 = struct.readm %34[@out] : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %16[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %40 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %41 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %42 = scf.for %arg5 = %39 to %40 step %41 iter_args(%arg6 = %33) -> (!felt.type<"babybear">) { + %43 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %44 = bool.cmp lt(%43, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %47 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%47) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %47 = array.read %15[%c0] : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %48 = struct.readm %47[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = felt.mul %43, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.sub %50, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %48[%52] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.mul %43, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %54, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %arg1[%56] = %53 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %57 : !felt.type<"babybear"> + } + %46 = felt.add %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %45 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %42, %32#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %20 = array.read %13[%c0] : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "constrain"} + %21 = array.read %14[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_7::@Bits2Num_7::@constrain(%20, %22) : (!struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %30 = array.read %17[%c0, %arg3, %arg4, %arg5] : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %31 = array.read %18[%c0, %arg3, %arg4, %arg5] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%30, %32, %33) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %23 = array.read %15[%c0] : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %24 = array.read %16[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %25 = pod.read %24[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%23, %25) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %26 = array.read %11[%c0] : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "constrain"} + %27 = array.read %12[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = pod.read %27[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AES256Encrypt_6::@AES256Encrypt_6::@constrain(%26, %28, %29) : (!struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">>, !array.type<1920 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@AES256CTR_8::@AES256CTR_8<[]>> + } + function.def @compute(%arg0: !array.type<128 x !felt.type<"babybear">>, %arg1: !array.type<128 x !felt.type<"babybear">>, %arg2: !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256CTR_8::@AES256CTR_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1920 = arith.constant 1920 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c3 = arith.constant 3 : index + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c2048 = arith.constant {product_source = "compute"} 2048 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@AES256CTR_8::@AES256CTR_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c2048 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_0 = array.new : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %1 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %1[@count] = %c32 : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%c0] = %1 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_2 = array.new : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %2 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%c0] = %2 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_4 = array.new : <1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %10 = array.read %array_5[%c0, %arg3, %arg4, %arg5] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %10[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%c0, %arg3, %arg4, %arg5] = %10 : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_8 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_8[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<16,8 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_9[%c0] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c1] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c2] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c3] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c4] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c5] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c6] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c7] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c8] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c9] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c10] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c11] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c12] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c13] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c14] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c15] = %nondet_10 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + %3:2 = scf.while (%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %10 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%10) %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">, %arg4: !felt.type<"babybear">): + scf.for %arg5 = %c0 to %c128 step %c1 { + %28 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg1[%29] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %31[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %32[%33] = %30 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %34[@in] = %32 : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %34 : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %34[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %34[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %41 = function.call @AES256Encrypt_6::@AES256Encrypt_6::@compute(%39, %40) : (!array.type<128 x !felt.type<"babybear">>, !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + pod.write %35[@comp] = %41 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + array.write %array[%c0] = %35 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c1920 step %c1 { + %28 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg2[%29] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %31[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %32[%33] = %30 : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_0[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %34[@ks] = %32 : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %34 : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %34[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %34[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %41 = function.call @AES256Encrypt_6::@AES256Encrypt_6::@compute(%39, %40) : (!array.type<128 x !felt.type<"babybear">>, !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + pod.write %35[@comp] = %41 : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + array.write %array[%c0] = %35 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %13:2 = scf.for %arg5 = %c0 to %c4 step %c1 iter_args(%arg6 = %arg4, %arg7 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %28 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %29:2 = scf.while (%arg8 = %arg7, %arg9 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %30 = bool.cmp lt(%arg9, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%30) %arg8, %arg9 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg8: !felt.type<"babybear">, %arg9: !felt.type<"babybear">): + %30 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %32 = bool.cmp lt(%arg10, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%32) %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %32 = felt.mul %28, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %32, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.add %33, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_6[%c0, %39, %40, %41] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %42[@a] = %38 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0, %43, %44, %45] = %42 : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %46 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array_5[%c0, %46, %47, %48] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %86 = pod.read %42[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %42[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = function.call @XOR_0::@XOR_0::@compute(%86, %87) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %49[@comp] = %88 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %89 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%c0, %89, %90, %91] = %49 : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %53 = felt.mul %28, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.add %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.add %55, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %12[%57] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array_6[%c0, %59, %60, %61] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %62[@b] = %58 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0, %63, %64, %65] = %62 : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %66 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %array_5[%c0, %66, %67, %68] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %70 = pod.read %69[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %71 = arith.subi %70, %c1 {product_source = "compute"} : index + pod.write %69[@count] = %71 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %72 = arith.cmpi eq, %71, %c0 {product_source = "compute"} : index + scf.if %72 { + %86 = pod.read %62[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = pod.read %62[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %88 = function.call @XOR_0::@XOR_0::@compute(%86, %87) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %69[@comp] = %88 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %89 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%c0, %89, %90, %91] = %69 : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %73 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_5[%c0, %73, %74, %75] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %77 = pod.read %76[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %78 = struct.readm %77[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %79 = felt.mul %28, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = felt.add %79, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.mul %arg9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = felt.add %80, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %83 = felt.add %82, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%84] = %78 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %85 : !felt.type<"babybear"> + } + %31 = felt.add %arg9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %29#1, %29#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %14 = scf.for %arg5 = %c0 to %c4 step %c1 iter_args(%arg6 = %13#0) -> (!felt.type<"babybear">) { + %28 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %30 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%30) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %30 = felt.mul %28, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %30, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = felt.sub %31, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %arg1[%33] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_2[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = pod.read %35[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %37 = felt.mul %28, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %37, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%39] = %34 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_2[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %40[@in] = %36 : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_2[%c0] = %40 : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %41 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %42 = pod.read %41[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %41[@count] = %43 : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %46 = pod.read %40[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @Bits2Num_7::@Bits2Num_7::@compute(%46) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + pod.write %41[@comp] = %47 : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + array.write %array_1[%c0] = %41 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %45 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %45 : !felt.type<"babybear"> + } + scf.yield %29 : !felt.type<"babybear"> + } {product_source = "compute"} + %15 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_4[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@in] = %18 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%c0] = %19 : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %20 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %28 = pod.read %19[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%28) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %20[@comp] = %29 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_3[%c0] = %20 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %25 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %26 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %27 = scf.for %arg5 = %24 to %25 step %26 iter_args(%arg6 = %14) -> (!felt.type<"babybear">) { + %28 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %29 = bool.cmp lt(%28, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %32 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%32) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %32 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %33 = pod.read %32[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %34 = struct.readm %33[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %35 = felt.mul %28, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.sub %36, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %34[%38] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.mul %28, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + array.write %arg1[%42] = %39 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %43 : !felt.type<"babybear"> + } + %31 = felt.add %28, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %30 : !felt.type<"babybear"> + } + scf.yield %13#1, %27, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@bits2num_1$inputs] = %array_2 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_11 = array.new : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> {product_source = "compute"} + %4 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + array.write %array_11[%c0] = %5 : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "compute"} + struct.writem %self[@bits2num_1] = %array_11 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_6 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %10 = array.read %array_5[%c0, %arg3, %arg4, %arg5] : <1,4,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_12[%c0, %arg3, %arg4, %arg5] = %11 : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_12 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_1$inputs] = %array_4 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_13 = array.new : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + %6 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_13[%c0] = %7 : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@num2bits_1] = %array_13 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@aes_256_encrypt_1$inputs] = %array_0 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_14 = array.new : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> {product_source = "compute"} + %8 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + array.write %array_14[%c0] = %9 : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + struct.writem %self[@aes_256_encrypt_1] = %array_14 : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AES256CTR_8::@AES256CTR_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@AES256CTR_8::@AES256CTR_8<[]>>, %arg1: !array.type<128 x !felt.type<"babybear">>, %arg2: !array.type<128 x !felt.type<"babybear">>, %arg3: !array.type<1920 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1920 = arith.constant 1920 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c32 = arith.constant {product_source = "constrain"} 32 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "constrain"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "constrain"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aes_256_encrypt_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aes_256_encrypt_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@bits2num_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@bits2num_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@num2bits_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@num2bits_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@xor_1] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@xor_1$inputs] : <@AES256CTR_8::@AES256CTR_8<[]>>, !array.type<1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c3] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c4] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c5] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c6] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c7] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c8] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c9] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c10] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c11] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c12] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c13] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c14] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c15] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c16] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c17] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c18] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c19] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c20] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c21] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c22] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c23] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c24] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c25] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c26] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c27] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c28] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c29] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c30] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c31] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c32] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c33] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c34] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c35] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c36] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c37] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c38] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c39] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c40] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c41] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c42] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c43] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c44] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c45] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c46] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c47] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c48] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c49] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c50] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c51] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c52] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c53] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c54] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c55] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c56] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c57] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c58] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c59] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c60] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c61] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c62] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c63] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c64] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c65] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c66] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c67] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c68] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c69] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c70] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c71] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c72] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c73] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c74] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c75] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c76] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c77] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c78] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c79] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c80] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c81] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c82] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c83] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c84] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c85] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c86] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c87] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c88] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c89] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c90] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c91] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c92] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c93] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c94] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c95] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c96] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c97] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c98] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c99] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c100] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c101] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c102] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c103] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c104] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c105] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c106] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c107] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c108] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c109] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c110] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c111] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c112] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c113] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c114] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c115] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c116] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c117] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c118] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c119] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c120] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c121] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c122] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c123] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c124] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c125] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c126] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c127] = %felt_const_0 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<16,8 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_2[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_1[%c0] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c1] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c2] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c3] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c4] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c5] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c6] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c7] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c8] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c9] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c10] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c11] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c12] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c13] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c14] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c15] = %nondet_2 : <16,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + %9:2 = scf.while (%arg4 = %felt_const_0, %arg5 = %felt_const_0, %arg6 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %20 = bool.cmp lt(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%20) %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg4: !felt.type<"babybear">, %arg5: !felt.type<"babybear">): + scf.for %arg6 = %c0 to %c128 step %c1 { + %33 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %arg2[%34] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %2[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = pod.read %36[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %37[%38] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c1920 step %c1 { + %33 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %arg3[%34] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %2[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = pod.read %36[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %37[%38] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %20 = array.read %1[%c0] : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %22:2 = scf.for %arg6 = %c0 to %c4 step %c1 iter_args(%arg7 = %arg5, %arg8 = %arg4) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %33 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %34:2 = scf.while (%arg9 = %arg7, %arg10 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %35 = bool.cmp lt(%arg10, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%35) {product_source = "constrain"} %arg9, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg9: !felt.type<"babybear">, %arg10: !felt.type<"babybear">): + %35 = scf.while (%arg11 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %37 = bool.cmp lt(%arg11, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%37) {product_source = "constrain"} %arg11 : !felt.type<"babybear"> + } do { + ^bb0(%arg11: !felt.type<"babybear">): + %37 = felt.mul %33, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %37, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %40, %arg11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %arg1[%42] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %arg11 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %8[%c0, %44, %45, %46] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = pod.read %47[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %33, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.mul %arg10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %49, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.add %51, %arg11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %21[%53] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %arg11 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %8[%c0, %55, %56, %57] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %59 = pod.read %58[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %arg11 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %7[%c0, %60, %61, %62] : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %64 = struct.readm %63[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %65 = felt.mul %33, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = felt.add %65, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %67 = felt.mul %arg10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %66, %67 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = felt.add %68, %arg11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %0[%70] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = felt.add %arg11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %72 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %36 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %35, %36 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %34#0, %34#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %23 = scf.for %arg6 = %c0 to %c4 step %c1 iter_args(%arg7 = %22#1) -> (!felt.type<"babybear">) { + %33 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %34 = scf.while (%arg8 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %35 = bool.cmp lt(%arg8, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%35) {product_source = "constrain"} %arg8 : !felt.type<"babybear"> + } do { + ^bb0(%arg8: !felt.type<"babybear">): + %35 = felt.mul %33, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.add %35, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.sub %36, %arg8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %arg2[%38] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %4[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = pod.read %40[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = felt.mul %33, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %41[%44] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %arg8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %46 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %34 : !felt.type<"babybear"> + } {product_source = "constrain"} + %24 = array.read %3[%c0] : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "constrain"} + %25 = struct.readm %24[@out] : <@Bits2Num_7::@Bits2Num_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.add %25, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %6[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %30 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %31 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %32 = scf.for %arg6 = %29 to %30 step %31 iter_args(%arg7 = %23) -> (!felt.type<"babybear">) { + %33 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %34 = bool.cmp lt(%33, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = scf.while (%arg8 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %37 = bool.cmp lt(%arg8, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%37) %arg8 : !felt.type<"babybear"> + } do { + ^bb0(%arg8: !felt.type<"babybear">): + %37 = array.read %5[%c0] : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %38 = struct.readm %37[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = felt.mul %33, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %39, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.sub %40, %arg8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %38[%42] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %33, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %arg2[%46] = %43 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %arg8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %47 : !felt.type<"babybear"> + } + %36 = felt.add %33, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %35 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %32, %22#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = array.read %3[%c0] : <1 x !struct.type<@Bits2Num_7::@Bits2Num_7<[]>>>, !struct.type<@Bits2Num_7::@Bits2Num_7<[]>> {product_source = "constrain"} + %11 = array.read %4[%c0] : <1 x !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = pod.read %11[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_7::@Bits2Num_7::@constrain(%10, %12) : (!struct.type<@Bits2Num_7::@Bits2Num_7<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c32 step %c1 { + %20 = array.read %7[%c0, %arg4, %arg5, %arg6] : <1,4,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %21 = array.read %8[%c0, %arg4, %arg5, %arg6] : <1,4,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %21[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%20, %22, %23) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %13 = array.read %5[%c0] : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %14 = array.read %6[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%13, %15) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %16 = array.read %1[%c0] : <1 x !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>>, !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "constrain"} + %17 = array.read %2[%c0] : <1 x !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = pod.read %17[@ks] : <[@in: !array.type<128 x !felt.type<"babybear">>, @ks: !array.type<1920 x !felt.type<"babybear">>]>, !array.type<1920 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AES256Encrypt_6::@AES256Encrypt_6::@constrain(%16, %18, %19) : (!struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">>, !array.type<1920 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/aes_256_encrypt_test.llzk b/examples/circom-demo/aes_256_encrypt_test.llzk new file mode 100644 index 0000000..bfb6d13 --- /dev/null +++ b/examples/circom-demo/aes_256_encrypt_test.llzk @@ -0,0 +1,7819 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>} { + function.def @emulated_aesenc_rijndael_sbox_0(%arg0: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c255 = arith.constant 255 : index + %c254 = arith.constant 254 : index + %c253 = arith.constant 253 : index + %c252 = arith.constant 252 : index + %c251 = arith.constant 251 : index + %c250 = arith.constant 250 : index + %c249 = arith.constant 249 : index + %c248 = arith.constant 248 : index + %c247 = arith.constant 247 : index + %c246 = arith.constant 246 : index + %c245 = arith.constant 245 : index + %c244 = arith.constant 244 : index + %c243 = arith.constant 243 : index + %c242 = arith.constant 242 : index + %c241 = arith.constant 241 : index + %c240 = arith.constant 240 : index + %c239 = arith.constant 239 : index + %c238 = arith.constant 238 : index + %c237 = arith.constant 237 : index + %c236 = arith.constant 236 : index + %c235 = arith.constant 235 : index + %c234 = arith.constant 234 : index + %c233 = arith.constant 233 : index + %c232 = arith.constant 232 : index + %c231 = arith.constant 231 : index + %c230 = arith.constant 230 : index + %c229 = arith.constant 229 : index + %c228 = arith.constant 228 : index + %c227 = arith.constant 227 : index + %c226 = arith.constant 226 : index + %c225 = arith.constant 225 : index + %c224 = arith.constant 224 : index + %c223 = arith.constant 223 : index + %c222 = arith.constant 222 : index + %c221 = arith.constant 221 : index + %c220 = arith.constant 220 : index + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_255 = felt.const 255 : <"babybear"> + %felt_const_254 = felt.const 254 : <"babybear"> + %felt_const_253 = felt.const 253 : <"babybear"> + %felt_const_252 = felt.const 252 : <"babybear"> + %felt_const_251 = felt.const 251 : <"babybear"> + %felt_const_250 = felt.const 250 : <"babybear"> + %felt_const_249 = felt.const 249 : <"babybear"> + %felt_const_248 = felt.const 248 : <"babybear"> + %felt_const_247 = felt.const 247 : <"babybear"> + %felt_const_246 = felt.const 246 : <"babybear"> + %felt_const_245 = felt.const 245 : <"babybear"> + %felt_const_244 = felt.const 244 : <"babybear"> + %felt_const_243 = felt.const 243 : <"babybear"> + %felt_const_242 = felt.const 242 : <"babybear"> + %felt_const_241 = felt.const 241 : <"babybear"> + %felt_const_240 = felt.const 240 : <"babybear"> + %felt_const_239 = felt.const 239 : <"babybear"> + %felt_const_238 = felt.const 238 : <"babybear"> + %felt_const_237 = felt.const 237 : <"babybear"> + %felt_const_236 = felt.const 236 : <"babybear"> + %felt_const_235 = felt.const 235 : <"babybear"> + %felt_const_234 = felt.const 234 : <"babybear"> + %felt_const_233 = felt.const 233 : <"babybear"> + %felt_const_232 = felt.const 232 : <"babybear"> + %felt_const_231 = felt.const 231 : <"babybear"> + %felt_const_230 = felt.const 230 : <"babybear"> + %felt_const_229 = felt.const 229 : <"babybear"> + %felt_const_228 = felt.const 228 : <"babybear"> + %felt_const_227 = felt.const 227 : <"babybear"> + %felt_const_226 = felt.const 226 : <"babybear"> + %felt_const_225 = felt.const 225 : <"babybear"> + %felt_const_224 = felt.const 224 : <"babybear"> + %felt_const_223 = felt.const 223 : <"babybear"> + %felt_const_222 = felt.const 222 : <"babybear"> + %felt_const_221 = felt.const 221 : <"babybear"> + %felt_const_220 = felt.const 220 : <"babybear"> + %felt_const_219 = felt.const 219 : <"babybear"> + %felt_const_218 = felt.const 218 : <"babybear"> + %felt_const_217 = felt.const 217 : <"babybear"> + %felt_const_216 = felt.const 216 : <"babybear"> + %felt_const_215 = felt.const 215 : <"babybear"> + %felt_const_214 = felt.const 214 : <"babybear"> + %felt_const_213 = felt.const 213 : <"babybear"> + %felt_const_212 = felt.const 212 : <"babybear"> + %felt_const_211 = felt.const 211 : <"babybear"> + %felt_const_210 = felt.const 210 : <"babybear"> + %felt_const_209 = felt.const 209 : <"babybear"> + %felt_const_208 = felt.const 208 : <"babybear"> + %felt_const_207 = felt.const 207 : <"babybear"> + %felt_const_206 = felt.const 206 : <"babybear"> + %felt_const_205 = felt.const 205 : <"babybear"> + %felt_const_204 = felt.const 204 : <"babybear"> + %felt_const_203 = felt.const 203 : <"babybear"> + %felt_const_202 = felt.const 202 : <"babybear"> + %felt_const_201 = felt.const 201 : <"babybear"> + %felt_const_200 = felt.const 200 : <"babybear"> + %felt_const_199 = felt.const 199 : <"babybear"> + %felt_const_198 = felt.const 198 : <"babybear"> + %felt_const_197 = felt.const 197 : <"babybear"> + %felt_const_196 = felt.const 196 : <"babybear"> + %felt_const_195 = felt.const 195 : <"babybear"> + %felt_const_194 = felt.const 194 : <"babybear"> + %felt_const_193 = felt.const 193 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_191 = felt.const 191 : <"babybear"> + %felt_const_190 = felt.const 190 : <"babybear"> + %felt_const_189 = felt.const 189 : <"babybear"> + %felt_const_188 = felt.const 188 : <"babybear"> + %felt_const_187 = felt.const 187 : <"babybear"> + %felt_const_186 = felt.const 186 : <"babybear"> + %felt_const_185 = felt.const 185 : <"babybear"> + %felt_const_184 = felt.const 184 : <"babybear"> + %felt_const_183 = felt.const 183 : <"babybear"> + %felt_const_182 = felt.const 182 : <"babybear"> + %felt_const_181 = felt.const 181 : <"babybear"> + %felt_const_180 = felt.const 180 : <"babybear"> + %felt_const_179 = felt.const 179 : <"babybear"> + %felt_const_178 = felt.const 178 : <"babybear"> + %felt_const_177 = felt.const 177 : <"babybear"> + %felt_const_176 = felt.const 176 : <"babybear"> + %felt_const_175 = felt.const 175 : <"babybear"> + %felt_const_174 = felt.const 174 : <"babybear"> + %felt_const_173 = felt.const 173 : <"babybear"> + %felt_const_172 = felt.const 172 : <"babybear"> + %felt_const_171 = felt.const 171 : <"babybear"> + %felt_const_170 = felt.const 170 : <"babybear"> + %felt_const_169 = felt.const 169 : <"babybear"> + %felt_const_168 = felt.const 168 : <"babybear"> + %felt_const_167 = felt.const 167 : <"babybear"> + %felt_const_166 = felt.const 166 : <"babybear"> + %felt_const_165 = felt.const 165 : <"babybear"> + %felt_const_164 = felt.const 164 : <"babybear"> + %felt_const_163 = felt.const 163 : <"babybear"> + %felt_const_162 = felt.const 162 : <"babybear"> + %felt_const_161 = felt.const 161 : <"babybear"> + %felt_const_160 = felt.const 160 : <"babybear"> + %felt_const_159 = felt.const 159 : <"babybear"> + %felt_const_158 = felt.const 158 : <"babybear"> + %felt_const_157 = felt.const 157 : <"babybear"> + %felt_const_156 = felt.const 156 : <"babybear"> + %felt_const_155 = felt.const 155 : <"babybear"> + %felt_const_154 = felt.const 154 : <"babybear"> + %felt_const_153 = felt.const 153 : <"babybear"> + %felt_const_152 = felt.const 152 : <"babybear"> + %felt_const_151 = felt.const 151 : <"babybear"> + %felt_const_150 = felt.const 150 : <"babybear"> + %felt_const_149 = felt.const 149 : <"babybear"> + %felt_const_148 = felt.const 148 : <"babybear"> + %felt_const_147 = felt.const 147 : <"babybear"> + %felt_const_146 = felt.const 146 : <"babybear"> + %felt_const_145 = felt.const 145 : <"babybear"> + %felt_const_144 = felt.const 144 : <"babybear"> + %felt_const_143 = felt.const 143 : <"babybear"> + %felt_const_142 = felt.const 142 : <"babybear"> + %felt_const_141 = felt.const 141 : <"babybear"> + %felt_const_140 = felt.const 140 : <"babybear"> + %felt_const_139 = felt.const 139 : <"babybear"> + %felt_const_138 = felt.const 138 : <"babybear"> + %felt_const_137 = felt.const 137 : <"babybear"> + %felt_const_136 = felt.const 136 : <"babybear"> + %felt_const_135 = felt.const 135 : <"babybear"> + %felt_const_134 = felt.const 134 : <"babybear"> + %felt_const_133 = felt.const 133 : <"babybear"> + %felt_const_132 = felt.const 132 : <"babybear"> + %felt_const_131 = felt.const 131 : <"babybear"> + %felt_const_130 = felt.const 130 : <"babybear"> + %felt_const_129 = felt.const 129 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_127 = felt.const 127 : <"babybear"> + %felt_const_126 = felt.const 126 : <"babybear"> + %felt_const_125 = felt.const 125 : <"babybear"> + %felt_const_124 = felt.const 124 : <"babybear"> + %felt_const_123 = felt.const 123 : <"babybear"> + %felt_const_122 = felt.const 122 : <"babybear"> + %felt_const_121 = felt.const 121 : <"babybear"> + %felt_const_120 = felt.const 120 : <"babybear"> + %felt_const_119 = felt.const 119 : <"babybear"> + %felt_const_118 = felt.const 118 : <"babybear"> + %felt_const_117 = felt.const 117 : <"babybear"> + %felt_const_116 = felt.const 116 : <"babybear"> + %felt_const_115 = felt.const 115 : <"babybear"> + %felt_const_114 = felt.const 114 : <"babybear"> + %felt_const_113 = felt.const 113 : <"babybear"> + %felt_const_112 = felt.const 112 : <"babybear"> + %felt_const_111 = felt.const 111 : <"babybear"> + %felt_const_110 = felt.const 110 : <"babybear"> + %felt_const_109 = felt.const 109 : <"babybear"> + %felt_const_108 = felt.const 108 : <"babybear"> + %felt_const_107 = felt.const 107 : <"babybear"> + %felt_const_106 = felt.const 106 : <"babybear"> + %felt_const_105 = felt.const 105 : <"babybear"> + %felt_const_104 = felt.const 104 : <"babybear"> + %felt_const_103 = felt.const 103 : <"babybear"> + %felt_const_102 = felt.const 102 : <"babybear"> + %felt_const_101 = felt.const 101 : <"babybear"> + %felt_const_100 = felt.const 100 : <"babybear"> + %felt_const_99 = felt.const 99 : <"babybear"> + %felt_const_98 = felt.const 98 : <"babybear"> + %felt_const_97 = felt.const 97 : <"babybear"> + %felt_const_96 = felt.const 96 : <"babybear"> + %felt_const_95 = felt.const 95 : <"babybear"> + %felt_const_94 = felt.const 94 : <"babybear"> + %felt_const_93 = felt.const 93 : <"babybear"> + %felt_const_92 = felt.const 92 : <"babybear"> + %felt_const_91 = felt.const 91 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_89 = felt.const 89 : <"babybear"> + %felt_const_88 = felt.const 88 : <"babybear"> + %felt_const_87 = felt.const 87 : <"babybear"> + %felt_const_86 = felt.const 86 : <"babybear"> + %felt_const_85 = felt.const 85 : <"babybear"> + %felt_const_84 = felt.const 84 : <"babybear"> + %felt_const_83 = felt.const 83 : <"babybear"> + %felt_const_82 = felt.const 82 : <"babybear"> + %felt_const_81 = felt.const 81 : <"babybear"> + %felt_const_80 = felt.const 80 : <"babybear"> + %felt_const_79 = felt.const 79 : <"babybear"> + %felt_const_78 = felt.const 78 : <"babybear"> + %felt_const_77 = felt.const 77 : <"babybear"> + %felt_const_76 = felt.const 76 : <"babybear"> + %felt_const_75 = felt.const 75 : <"babybear"> + %felt_const_74 = felt.const 74 : <"babybear"> + %felt_const_73 = felt.const 73 : <"babybear"> + %felt_const_72 = felt.const 72 : <"babybear"> + %felt_const_71 = felt.const 71 : <"babybear"> + %felt_const_70 = felt.const 70 : <"babybear"> + %felt_const_69 = felt.const 69 : <"babybear"> + %felt_const_68 = felt.const 68 : <"babybear"> + %felt_const_67 = felt.const 67 : <"babybear"> + %felt_const_66 = felt.const 66 : <"babybear"> + %felt_const_65 = felt.const 65 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_60 = felt.const 60 : <"babybear"> + %felt_const_59 = felt.const 59 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_57 = felt.const 57 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_53 = felt.const 53 : <"babybear"> + %felt_const_52 = felt.const 52 : <"babybear"> + %felt_const_51 = felt.const 51 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_48 = felt.const 48 : <"babybear"> + %felt_const_47 = felt.const 47 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_42 = felt.const 42 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %felt_const_40 = felt.const 40 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_38 = felt.const 38 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_35 = felt.const 35 : <"babybear"> + %felt_const_34 = felt.const 34 : <"babybear"> + %felt_const_33 = felt.const 33 : <"babybear"> + %felt_const_32 = felt.const 32 : <"babybear"> + %felt_const_31 = felt.const 31 : <"babybear"> + %felt_const_30 = felt.const 30 : <"babybear"> + %felt_const_29 = felt.const 29 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %felt_const_26 = felt.const 26 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_24 = felt.const 24 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_22 = felt.const 22 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %felt_const_17 = felt.const 17 : <"babybear"> + %felt_const_16 = felt.const 16 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %felt_const_13 = felt.const 13 : <"babybear"> + %felt_const_12 = felt.const 12 : <"babybear"> + %felt_const_11 = felt.const 11 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %felt_const_5 = felt.const 5 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c218] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c219] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c220] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c221] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c222] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c223] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c224] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c225] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c226] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c227] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c228] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c229] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c230] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c231] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c232] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c233] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c234] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c235] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c236] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c237] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c238] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c239] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c240] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c241] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c242] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c243] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c244] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c245] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c246] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c247] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c248] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c249] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c250] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c251] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c252] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c253] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c255] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_99 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_124 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_119 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_123 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_242 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_107 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_111 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_197 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_48 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_1 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_103 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_43 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_254 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_215 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_171 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_118 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_202 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_130 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_201 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_125 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_250 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_89 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_71 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_240 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_173 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_212 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_162 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_175 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_156 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_164 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_114 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_192 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_183 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_253 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_147 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_38 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_54 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_63 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_247 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_204 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_52 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_165 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_229 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_241 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_113 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_216 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_49 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_21 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_199 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_35 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_195 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_24 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_150 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_5 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_154 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_7 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_18 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_128 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_226 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_235 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_39 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_178 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_117 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_9 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_131 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_44 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_26 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_27 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_110 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_90 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_160 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_82 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_59 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_214 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_179 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_41 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_227 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_47 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_132 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_83 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_209 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_237 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_32 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_252 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_177 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_91 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_106 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_203 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_190 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_57 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_74 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_76 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_88 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_207 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_208 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_239 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_170 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_251 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_67 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_77 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_51 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_133 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_69 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_249 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_2 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_127 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_80 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_60 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_159 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_168 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_81 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_163 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_64 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_143 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_146 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_157 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_56 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_245 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_188 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_182 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_218 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_33 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_16 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_255 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_243 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_210 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_205 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_12 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_19 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_236 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_95 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_151 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_68 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_23 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_196 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_167 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_126 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_61 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_100 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_93 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_25 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_115 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_96 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_129 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_79 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_220 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_34 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_42 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_144 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_136 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_70 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_238 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_184 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_20 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_222 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_94 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_11 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_219 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_224 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_50 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_58 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_10 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_73 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_6 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_36 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_92 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_194 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_211 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_172 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_98 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_145 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_149 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_228 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_121 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_231 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_200 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_55 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_109 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_141 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_213 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_78 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_169 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_108 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_86 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_244 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_234 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_101 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_122 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_174 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_8 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_186 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_120 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_37 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_46 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_28 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_166 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_180 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_198 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_232 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_221 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_116 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_31 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_75 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_189 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_139 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_138 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_112 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_62 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_181 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_102 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_72 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_246 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_14 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_97 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_53 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c218] = %felt_const_87 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c219] = %felt_const_185 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c220] = %felt_const_134 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c221] = %felt_const_193 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c222] = %felt_const_29 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c223] = %felt_const_158 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c224] = %felt_const_225 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c225] = %felt_const_248 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c226] = %felt_const_152 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c227] = %felt_const_17 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c228] = %felt_const_105 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c229] = %felt_const_217 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c230] = %felt_const_142 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c231] = %felt_const_148 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c232] = %felt_const_155 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c233] = %felt_const_30 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c234] = %felt_const_135 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c235] = %felt_const_233 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c236] = %felt_const_206 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c237] = %felt_const_85 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c238] = %felt_const_40 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c239] = %felt_const_223 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c240] = %felt_const_140 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c241] = %felt_const_161 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c242] = %felt_const_137 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c243] = %felt_const_13 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c244] = %felt_const_191 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c245] = %felt_const_230 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c246] = %felt_const_66 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c247] = %felt_const_104 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c248] = %felt_const_65 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c249] = %felt_const_153 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c250] = %felt_const_45 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c251] = %felt_const_15 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c252] = %felt_const_176 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c253] = %felt_const_84 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c254] = %felt_const_187 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c255] = %felt_const_22 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg0 : !felt.type<"babybear"> + %1 = array.read %nondet[%0] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %1 : !felt.type<"babybear"> + } + function.def @emulated_aesenc_enc_table_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c255 = arith.constant 255 : index + %c254 = arith.constant 254 : index + %c253 = arith.constant 253 : index + %c252 = arith.constant 252 : index + %c251 = arith.constant 251 : index + %c250 = arith.constant 250 : index + %c249 = arith.constant 249 : index + %c248 = arith.constant 248 : index + %c247 = arith.constant 247 : index + %c246 = arith.constant 246 : index + %c245 = arith.constant 245 : index + %c244 = arith.constant 244 : index + %c243 = arith.constant 243 : index + %c242 = arith.constant 242 : index + %c241 = arith.constant 241 : index + %c240 = arith.constant 240 : index + %c239 = arith.constant 239 : index + %c238 = arith.constant 238 : index + %c237 = arith.constant 237 : index + %c236 = arith.constant 236 : index + %c235 = arith.constant 235 : index + %c234 = arith.constant 234 : index + %c233 = arith.constant 233 : index + %c232 = arith.constant 232 : index + %c231 = arith.constant 231 : index + %c230 = arith.constant 230 : index + %c229 = arith.constant 229 : index + %c228 = arith.constant 228 : index + %c227 = arith.constant 227 : index + %c226 = arith.constant 226 : index + %c225 = arith.constant 225 : index + %c224 = arith.constant 224 : index + %c223 = arith.constant 223 : index + %c222 = arith.constant 222 : index + %c221 = arith.constant 221 : index + %c220 = arith.constant 220 : index + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_742004246 = felt.const 742004246 : <"babybear"> + %felt_const_1842789307 = felt.const 1842789307 : <"babybear"> + %felt_const_2835108948 = felt.const 2835108948 : <"babybear"> + %felt_const_2076946608 = felt.const 2076946608 : <"babybear"> + %felt_const_504434447 = felt.const 504434447 : <"babybear"> + %felt_const_1517759789 = felt.const 1517759789 : <"babybear"> + %felt_const_699439513 = felt.const 699439513 : <"babybear"> + %felt_const_2193834305 = felt.const 2193834305 : <"babybear"> + %felt_const_3501746280 = felt.const 3501746280 : <"babybear"> + %felt_const_2227585602 = felt.const 2227585602 : <"babybear"> + %felt_const_3610371814 = felt.const 3610371814 : <"babybear"> + %felt_const_1708834751 = felt.const 1708834751 : <"babybear"> + %felt_const_437718285 = felt.const 437718285 : <"babybear"> + %felt_const_159418761 = felt.const 159418761 : <"babybear"> + %felt_const_1509466529 = felt.const 1509466529 : <"babybear"> + %felt_const_59739276 = felt.const 59739276 : <"babybear"> + %felt_const_2776293343 = felt.const 2776293343 : <"babybear"> + %felt_const_1350051880 = felt.const 1350051880 : <"babybear"> + %felt_const_2868860245 = felt.const 2868860245 : <"babybear"> + %felt_const_2269761230 = felt.const 2269761230 : <"babybear"> + %felt_const_3374377449 = felt.const 3374377449 : <"babybear"> + %felt_const_361924487 = felt.const 361924487 : <"babybear"> + %felt_const_1008868894 = felt.const 1008868894 : <"babybear"> + %felt_const_766942107 = felt.const 766942107 : <"babybear"> + %felt_const_866620564 = felt.const 866620564 : <"babybear"> + %felt_const_126455438 = felt.const 126455438 : <"babybear"> + %felt_const_2842745305 = felt.const 2842745305 : <"babybear"> + %felt_const_3535497577 = felt.const 3535497577 : <"babybear"> + %felt_const_573772049 = felt.const 573772049 : <"babybear"> + %felt_const_733190296 = felt.const 733190296 : <"babybear"> + %felt_const_3943954680 = felt.const 3943954680 : <"babybear"> + %felt_const_3644383713 = felt.const 3644383713 : <"babybear"> + %felt_const_666476190 = felt.const 666476190 : <"babybear"> + %felt_const_975641885 = felt.const 975641885 : <"babybear"> + %felt_const_2572730817 = felt.const 2572730817 : <"babybear"> + %felt_const_395413126 = felt.const 395413126 : <"babybear"> + %felt_const_1775286713 = felt.const 1775286713 : <"babybear"> + %felt_const_2935576407 = felt.const 2935576407 : <"babybear"> + %felt_const_1784624437 = felt.const 1784624437 : <"babybear"> + %felt_const_3265487201 = felt.const 3265487201 : <"babybear"> + %felt_const_470945294 = felt.const 470945294 : <"babybear"> + %felt_const_4144101110 = felt.const 4144101110 : <"babybear"> + %felt_const_100991747 = felt.const 100991747 : <"babybear"> + %felt_const_2430093384 = felt.const 2430093384 : <"babybear"> + %felt_const_3433719398 = felt.const 3433719398 : <"babybear"> + %felt_const_1908716981 = felt.const 1908716981 : <"babybear"> + %felt_const_2084716094 = felt.const 2084716094 : <"babybear"> + %felt_const_3767562352 = felt.const 3767562352 : <"babybear"> + %felt_const_260409994 = felt.const 260409994 : <"babybear"> + %felt_const_226921355 = felt.const 226921355 : <"babybear"> + %felt_const_1641856445 = felt.const 1641856445 : <"babybear"> + %felt_const_2531085131 = felt.const 2531085131 : <"babybear"> + %felt_const_1042358047 = felt.const 1042358047 : <"babybear"> + %felt_const_3902567540 = felt.const 3902567540 : <"babybear"> + %felt_const_2709315037 = felt.const 2709315037 : <"babybear"> + %felt_const_3408128232 = felt.const 3408128232 : <"babybear"> + %felt_const_2538718918 = felt.const 2538718918 : <"babybear"> + %felt_const_1942467764 = felt.const 1942467764 : <"babybear"> + %felt_const_1475454630 = felt.const 1475454630 : <"babybear"> + %felt_const_941890588 = felt.const 941890588 : <"babybear"> + %felt_const_1550986798 = felt.const 1550986798 : <"babybear"> + %felt_const_1248797989 = felt.const 1248797989 : <"babybear"> + %felt_const_4035475576 = felt.const 4035475576 : <"babybear"> + %felt_const_1876277946 = felt.const 1876277946 : <"babybear"> + %felt_const_270010376 = felt.const 270010376 : <"babybear"> + %felt_const_1206496942 = felt.const 1206496942 : <"babybear"> + %felt_const_4102978170 = felt.const 4102978170 : <"babybear"> + %felt_const_3400492389 = felt.const 3400492389 : <"babybear"> + %felt_const_3475368682 = felt.const 3475368682 : <"babybear"> + %felt_const_4077384948 = felt.const 4077384948 : <"babybear"> + %felt_const_2902087254 = felt.const 2902087254 : <"babybear"> + %felt_const_3635702892 = felt.const 3635702892 : <"babybear"> + %felt_const_1239460265 = felt.const 1239460265 : <"babybear"> + %felt_const_2631028302 = felt.const 2631028302 : <"babybear"> + %felt_const_2976175573 = felt.const 2976175573 : <"babybear"> + %felt_const_25988493 = felt.const 25988493 : <"babybear"> + %felt_const_3669454189 = felt.const 3669454189 : <"babybear"> + %felt_const_1851340599 = felt.const 1851340599 : <"babybear"> + %felt_const_2336475336 = felt.const 2336475336 : <"babybear"> + %felt_const_3576883175 = felt.const 3576883175 : <"babybear"> + %felt_const_4069226873 = felt.const 4069226873 : <"babybear"> + %felt_const_3543655652 = felt.const 3543655652 : <"babybear"> + %felt_const_832869781 = felt.const 832869781 : <"babybear"> + %felt_const_967348625 = felt.const 967348625 : <"babybear"> + %felt_const_3299238498 = felt.const 3299238498 : <"babybear"> + %felt_const_1139780780 = felt.const 1139780780 : <"babybear"> + %felt_const_3178157011 = felt.const 3178157011 : <"babybear"> + %felt_const_2673722050 = felt.const 2673722050 : <"babybear"> + %felt_const_3101973596 = felt.const 3101973596 : <"babybear"> + %felt_const_1215046692 = felt.const 1215046692 : <"babybear"> + %felt_const_201983494 = felt.const 201983494 : <"babybear"> + %felt_const_2463844681 = felt.const 2463844681 : <"babybear"> + %felt_const_337512970 = felt.const 337512970 : <"babybear"> + %felt_const_1951283770 = felt.const 1951283770 : <"babybear"> + %felt_const_1683370546 = felt.const 1683370546 : <"babybear"> + %felt_const_3678134496 = felt.const 3678134496 : <"babybear"> + %felt_const_2910247899 = felt.const 2910247899 : <"babybear"> + %felt_const_371002123 = felt.const 371002123 : <"babybear"> + %felt_const_3168951902 = felt.const 3168951902 : <"babybear"> + %felt_const_2809781982 = felt.const 2809781982 : <"babybear"> + %felt_const_675025940 = felt.const 675025940 : <"babybear"> + %felt_const_1809037496 = felt.const 1809037496 : <"babybear"> + %felt_const_3341414126 = felt.const 3341414126 : <"babybear"> + %felt_const_2362066502 = felt.const 2362066502 : <"babybear"> + %felt_const_193169544 = felt.const 193169544 : <"babybear"> + %felt_const_1001099408 = felt.const 1001099408 : <"babybear"> + %felt_const_1417554474 = felt.const 1417554474 : <"babybear"> + %felt_const_1147544098 = felt.const 1147544098 : <"babybear"> + %felt_const_2743065820 = felt.const 2743065820 : <"babybear"> + %felt_const_2664517455 = felt.const 2664517455 : <"babybear"> + %felt_const_429425025 = felt.const 429425025 : <"babybear"> + %felt_const_3231735904 = felt.const 3231735904 : <"babybear"> + %felt_const_3868554099 = felt.const 3868554099 : <"babybear"> + %felt_const_841685273 = felt.const 841685273 : <"babybear"> + %felt_const_3135724893 = felt.const 3135724893 : <"babybear"> + %felt_const_3366741092 = felt.const 3366741092 : <"babybear"> + %felt_const_2051489085 = felt.const 2051489085 : <"babybear"> + %felt_const_4236410494 = felt.const 4236410494 : <"babybear"> + %felt_const_1441965991 = felt.const 1441965991 : <"babybear"> + %felt_const_2472002756 = felt.const 2472002756 : <"babybear"> + %felt_const_775493399 = felt.const 775493399 : <"babybear"> + %felt_const_2295088196 = felt.const 2295088196 : <"babybear"> + %felt_const_899848087 = felt.const 899848087 : <"babybear"> + %felt_const_3202441055 = felt.const 3202441055 : <"babybear"> + %felt_const_3274697964 = felt.const 3274697964 : <"babybear"> + %felt_const_641012499 = felt.const 641012499 : <"babybear"> + %felt_const_403966988 = felt.const 403966988 : <"babybear"> + %felt_const_2169294285 = felt.const 2169294285 : <"babybear"> + %felt_const_3211645650 = felt.const 3211645650 : <"babybear"> + %felt_const_4245615603 = felt.const 4245615603 : <"babybear"> + %felt_const_3843751935 = felt.const 3843751935 : <"babybear"> + %felt_const_540020752 = felt.const 540020752 : <"babybear"> + %felt_const_1113792801 = felt.const 1113792801 : <"babybear"> + %felt_const_2943736538 = felt.const 2943736538 : <"babybear"> + %felt_const_2009183926 = felt.const 2009183926 : <"babybear"> + %felt_const_1675607228 = felt.const 1675607228 : <"babybear"> + %felt_const_4043634165 = felt.const 4043634165 : <"babybear"> + %felt_const_1883781176 = felt.const 1883781176 : <"babybear"> + %felt_const_566009245 = felt.const 566009245 : <"babybear"> + %felt_const_1068339858 = felt.const 1068339858 : <"babybear"> + %felt_const_92966799 = felt.const 92966799 : <"babybear"> + %felt_const_2160083008 = felt.const 2160083008 : <"babybear"> + %felt_const_1576969123 = felt.const 1576969123 : <"babybear"> + %felt_const_2733855057 = felt.const 2733855057 : <"babybear"> + %felt_const_1273211048 = felt.const 1273211048 : <"babybear"> + %felt_const_632987551 = felt.const 632987551 : <"babybear"> + %felt_const_2017737788 = felt.const 2017737788 : <"babybear"> + %felt_const_2700103760 = felt.const 2700103760 : <"babybear"> + %felt_const_4269899647 = felt.const 4269899647 : <"babybear"> + %felt_const_67502594 = felt.const 67502594 : <"babybear"> + %felt_const_3910203897 = felt.const 3910203897 : <"babybear"> + %felt_const_2328839493 = felt.const 2328839493 : <"babybear"> + %felt_const_294946181 = felt.const 294946181 : <"babybear"> + %felt_const_1716859699 = felt.const 1716859699 : <"babybear"> + %felt_const_2597801293 = felt.const 2597801293 : <"babybear"> + %felt_const_2261074755 = felt.const 2261074755 : <"babybear"> + %felt_const_3977706491 = felt.const 3977706491 : <"babybear"> + %felt_const_1340451498 = felt.const 1340451498 : <"babybear"> + %felt_const_3307925487 = felt.const 3307925487 : <"babybear"> + %felt_const_3144405200 = felt.const 3144405200 : <"babybear"> + %felt_const_2236272591 = felt.const 2236272591 : <"babybear"> + %felt_const_2968016984 = felt.const 2968016984 : <"babybear"> + %felt_const_2564049996 = felt.const 2564049996 : <"babybear"> + %felt_const_2497595978 = felt.const 2497595978 : <"babybear"> + %felt_const_1917532473 = felt.const 1917532473 : <"babybear"> + %felt_const_1742323390 = felt.const 1742323390 : <"babybear"> + %felt_const_2370227147 = felt.const 2370227147 : <"babybear"> + %felt_const_3569248874 = felt.const 3569248874 : <"babybear"> + %felt_const_3069008731 = felt.const 3069008731 : <"babybear"> + %felt_const_2043195825 = felt.const 2043195825 : <"babybear"> + %felt_const_3810524412 = felt.const 3810524412 : <"babybear"> + %felt_const_1080041504 = felt.const 1080041504 : <"babybear"> + %felt_const_3240947181 = felt.const 3240947181 : <"babybear"> + %felt_const_3110654417 = felt.const 3110654417 : <"babybear"> + %felt_const_2801095507 = felt.const 2801095507 : <"babybear"> + %felt_const_328696964 = felt.const 328696964 : <"babybear"> + %felt_const_1584475951 = felt.const 1584475951 : <"babybear"> + %felt_const_3711886307 = felt.const 3711886307 : <"babybear"> + %felt_const_1383803177 = felt.const 1383803177 : <"babybear"> + %felt_const_2110698419 = felt.const 2110698419 : <"babybear"> + %felt_const_3076642518 = felt.const 3076642518 : <"babybear"> + %felt_const_1984772923 = felt.const 1984772923 : <"babybear"> + %felt_const_2767606354 = felt.const 2767606354 : <"babybear"> + %felt_const_1543217312 = felt.const 1543217312 : <"babybear"> + %felt_const_3035519578 = felt.const 3035519578 : <"babybear"> + %felt_const_3702681198 = felt.const 3702681198 : <"babybear"> + %felt_const_908925723 = felt.const 908925723 : <"babybear"> + %felt_const_875436570 = felt.const 875436570 : <"babybear"> + %felt_const_1484008492 = felt.const 1484008492 : <"babybear"> + %felt_const_496927619 = felt.const 496927619 : <"babybear"> + %felt_const_303761673 = felt.const 303761673 : <"babybear"> + %felt_const_3936318837 = felt.const 3936318837 : <"babybear"> + %felt_const_2144187058 = felt.const 2144187058 : <"babybear"> + %felt_const_1315514151 = felt.const 1315514151 : <"babybear"> + %felt_const_3441880043 = felt.const 3441880043 : <"babybear"> + %felt_const_3745374946 = felt.const 3745374946 : <"babybear"> + %felt_const_463175808 = felt.const 463175808 : <"babybear"> + %felt_const_607523346 = felt.const 607523346 : <"babybear"> + %felt_const_235472647 = felt.const 235472647 : <"babybear"> + %felt_const_800430746 = felt.const 800430746 : <"babybear"> + %felt_const_168756485 = felt.const 168756485 : <"babybear"> + %felt_const_933336726 = felt.const 933336726 : <"babybear"> + %felt_const_807933976 = felt.const 807933976 : <"babybear"> + %felt_const_2640233411 = felt.const 2640233411 : <"babybear"> + %felt_const_1181033251 = felt.const 1181033251 : <"babybear"> + %felt_const_2505230279 = felt.const 2505230279 : <"babybear"> + %felt_const_135005188 = felt.const 135005188 : <"babybear"> + %felt_const_708777237 = felt.const 708777237 : <"babybear"> + %felt_const_1649619249 = felt.const 1649619249 : <"babybear"> + %felt_const_2876496088 = felt.const 2876496088 : <"babybear"> + %felt_const_3801313649 = felt.const 3801313649 : <"babybear"> + %felt_const_4178113009 = felt.const 4178113009 : <"babybear"> + %felt_const_3509904869 = felt.const 3509904869 : <"babybear"> + %felt_const_1374987685 = felt.const 1374987685 : <"babybear"> + %felt_const_1750873140 = felt.const 1750873140 : <"babybear"> + %felt_const_2203045068 = felt.const 2203045068 : <"babybear"> + %felt_const_4110612471 = felt.const 4110612471 : <"babybear"> + %felt_const_2118205247 = felt.const 2118205247 : <"babybear"> + %felt_const_1817851446 = felt.const 1817851446 : <"babybear"> + %felt_const_1282024998 = felt.const 1282024998 : <"babybear"> + %felt_const_1034851219 = felt.const 1034851219 : <"babybear"> + %felt_const_3776773629 = felt.const 3776773629 : <"babybear"> + %felt_const_1975695287 = felt.const 1975695287 : <"babybear"> + %felt_const_2606481600 = felt.const 2606481600 : <"babybear"> + %felt_const_3835064946 = felt.const 3835064946 : <"babybear"> + %felt_const_1408738468 = felt.const 1408738468 : <"babybear"> + %felt_const_599760028 = felt.const 599760028 : <"babybear"> + %felt_const_1173008303 = felt.const 1173008303 : <"babybear"> + %felt_const_1610457762 = felt.const 1610457762 : <"babybear"> + %felt_const_3009926356 = felt.const 3009926356 : <"babybear"> + %felt_const_1106029997 = felt.const 1106029997 : <"babybear"> + %felt_const_4211863792 = felt.const 4211863792 : <"babybear"> + %felt_const_2395555655 = felt.const 2395555655 : <"babybear"> + %felt_const_3001768281 = felt.const 3001768281 : <"babybear"> + %felt_const_4011195130 = felt.const 4011195130 : <"babybear"> + %felt_const_4203183485 = felt.const 4203183485 : <"babybear"> + %felt_const_2302724553 = felt.const 2302724553 : <"babybear"> + %felt_const_530416258 = felt.const 530416258 : <"babybear"> + %felt_const_2403715786 = felt.const 2403715786 : <"babybear"> + %felt_const_3969545846 = felt.const 3969545846 : <"babybear"> + %felt_const_1306962859 = felt.const 1306962859 : <"babybear"> + %felt_const_3043153879 = felt.const 3043153879 : <"babybear"> + %felt_const_3877240574 = felt.const 3877240574 : <"babybear"> + %felt_const_1451043627 = felt.const 1451043627 : <"babybear"> + %felt_const_3467208551 = felt.const 3467208551 : <"babybear"> + %felt_const_33751297 = felt.const 33751297 : <"babybear"> + %felt_const_1615867952 = felt.const 1615867952 : <"babybear"> + %felt_const_2438251973 = felt.const 2438251973 : <"babybear"> + %felt_const_3736170351 = felt.const 3736170351 : <"babybear"> + %felt_const_3602738027 = felt.const 3602738027 : <"babybear"> + %felt_const_4279104242 = felt.const 4279104242 : <"babybear"> + %felt_const_4136467323 = felt.const 4136467323 : <"babybear"> + %felt_const_4003034999 = felt.const 4003034999 : <"babybear"> + %felt_const_4169432188 = felt.const 4169432188 : <"babybear"> + %felt_const_3332727651 = felt.const 3332727651 : <"babybear"> + %felt_const_371997206 = felt.const 371997206 : <"babybear"> + %felt_const_3144537787 = felt.const 3144537787 : <"babybear"> + %felt_const_1420360788 = felt.const 1420360788 : <"babybear"> + %felt_const_2960903088 = felt.const 2960903088 : <"babybear"> + %felt_const_253628687 = felt.const 253628687 : <"babybear"> + %felt_const_760903469 = felt.const 760903469 : <"babybear"> + %felt_const_2569646233 = felt.const 2569646233 : <"babybear"> + %felt_const_1099088705 = felt.const 1099088705 : <"babybear"> + %felt_const_1758509160 = felt.const 1758509160 : <"babybear"> + %felt_const_1115997762 = felt.const 1115997762 : <"babybear"> + %felt_const_3872862694 = felt.const 3872862694 : <"babybear"> + %felt_const_3211123391 = felt.const 3211123391 : <"babybear"> + %felt_const_219813645 = felt.const 219813645 : <"babybear"> + %felt_const_2299101321 = felt.const 2299101321 : <"babybear"> + %felt_const_2707028129 = felt.const 2707028129 : <"babybear"> + %felt_const_2349043596 = felt.const 2349043596 : <"babybear"> + %felt_const_3752164063 = felt.const 3752164063 : <"babybear"> + %felt_const_676362280 = felt.const 676362280 : <"babybear"> + %felt_const_1437269845 = felt.const 1437269845 : <"babybear"> + %felt_const_3464972750 = felt.const 3464972750 : <"babybear"> + %felt_const_3922272489 = felt.const 3922272489 : <"babybear"> + %felt_const_2266337927 = felt.const 2266337927 : <"babybear"> + %felt_const_507257374 = felt.const 507257374 : <"babybear"> + %felt_const_2603464347 = felt.const 2603464347 : <"babybear"> + %felt_const_2486413204 = felt.const 2486413204 : <"babybear"> + %felt_const_2382858638 = felt.const 2382858638 : <"babybear"> + %felt_const_3651760345 = felt.const 3651760345 : <"babybear"> + %felt_const_1775418217 = felt.const 1775418217 : <"babybear"> + %felt_const_287453969 = felt.const 287453969 : <"babybear"> + %felt_const_2553000856 = felt.const 2553000856 : <"babybear"> + %felt_const_4176155640 = felt.const 4176155640 : <"babybear"> + %felt_const_3789109473 = felt.const 3789109473 : <"babybear"> + %felt_const_2653403550 = felt.const 2653403550 : <"babybear"> + %felt_const_490350365 = felt.const 490350365 : <"babybear"> + %felt_const_3248052417 = felt.const 3248052417 : <"babybear"> + %felt_const_2249691526 = felt.const 2249691526 : <"babybear"> + %felt_const_3110719673 = felt.const 3110719673 : <"babybear"> + %felt_const_1471084887 = felt.const 1471084887 : <"babybear"> + %felt_const_896163637 = felt.const 896163637 : <"babybear"> + %felt_const_1640145761 = felt.const 1640145761 : <"babybear"> + %felt_const_236720654 = felt.const 236720654 : <"babybear"> + %felt_const_4143383030 = felt.const 4143383030 : <"babybear"> + %felt_const_50726147 = felt.const 50726147 : <"babybear"> + %felt_const_1217452104 = felt.const 1217452104 : <"babybear"> + %felt_const_1724688998 = felt.const 1724688998 : <"babybear"> + %felt_const_3044132021 = felt.const 3044132021 : <"babybear"> + %felt_const_1048330814 = felt.const 1048330814 : <"babybear"> + %felt_const_1893765232 = felt.const 1893765232 : <"babybear"> + %felt_const_2316273034 = felt.const 2316273034 : <"babybear"> + %felt_const_2332919435 = felt.const 2332919435 : <"babybear"> + %felt_const_3177307325 = felt.const 3177307325 : <"babybear"> + %felt_const_1268178251 = felt.const 1268178251 : <"babybear"> + %felt_const_524165407 = felt.const 524165407 : <"babybear"> + %felt_const_1961401460 = felt.const 1961401460 : <"babybear"> + %felt_const_3718347997 = felt.const 3718347997 : <"babybear"> + %felt_const_3905627112 = felt.const 3905627112 : <"babybear"> + %felt_const_3331805638 = felt.const 3331805638 : <"babybear"> + %felt_const_3027486644 = felt.const 3027486644 : <"babybear"> + %felt_const_2790781350 = felt.const 2790781350 : <"babybear"> + %felt_const_473441308 = felt.const 473441308 : <"babybear"> + %felt_const_777810478 = felt.const 777810478 : <"babybear"> + %felt_const_625635109 = felt.const 625635109 : <"babybear"> + %felt_const_2029029496 = felt.const 2029029496 : <"babybear"> + %felt_const_3127891386 = felt.const 3127891386 : <"babybear"> + %felt_const_135272456 = felt.const 135272456 : <"babybear"> + %felt_const_2923948462 = felt.const 2923948462 : <"babybear"> + %felt_const_2062847610 = felt.const 2062847610 : <"babybear"> + %felt_const_1707781989 = felt.const 1707781989 : <"babybear"> + %felt_const_3939444202 = felt.const 3939444202 : <"babybear"> + %felt_const_4109567988 = felt.const 4109567988 : <"babybear"> + %felt_const_1454176854 = felt.const 1454176854 : <"babybear"> + %felt_const_1826141292 = felt.const 1826141292 : <"babybear"> + %felt_const_2840191145 = felt.const 2840191145 : <"babybear"> + %felt_const_1318900302 = felt.const 1318900302 : <"babybear"> + %felt_const_3585172693 = felt.const 3585172693 : <"babybear"> + %felt_const_2365688973 = felt.const 2365688973 : <"babybear"> + %felt_const_1843050349 = felt.const 1843050349 : <"babybear"> + %felt_const_929978679 = felt.const 929978679 : <"babybear"> + %felt_const_3364570056 = felt.const 3364570056 : <"babybear"> + %felt_const_3889509095 = felt.const 3889509095 : <"babybear"> + %felt_const_2045938553 = felt.const 2045938553 : <"babybear"> + %felt_const_3839047652 = felt.const 3839047652 : <"babybear"> + %felt_const_2503058581 = felt.const 2503058581 : <"babybear"> + %felt_const_2436475025 = felt.const 2436475025 : <"babybear"> + %felt_const_1657054818 = felt.const 1657054818 : <"babybear"> + %felt_const_2890133420 = felt.const 2890133420 : <"babybear"> + %felt_const_3552407251 = felt.const 3552407251 : <"babybear"> + %felt_const_3265224130 = felt.const 3265224130 : <"babybear"> + %felt_const_1555620956 = felt.const 1555620956 : <"babybear"> + %felt_const_608726052 = felt.const 608726052 : <"babybear"> + %felt_const_101452294 = felt.const 101452294 : <"babybear"> + %felt_const_1234361161 = felt.const 1234361161 : <"babybear"> + %felt_const_169090570 = felt.const 169090570 : <"babybear"> + %felt_const_980700730 = felt.const 980700730 : <"babybear"> + %felt_const_845436466 = felt.const 845436466 : <"babybear"> + %felt_const_3772464096 = felt.const 3772464096 : <"babybear"> + %felt_const_3685578459 = felt.const 3685578459 : <"babybear"> + %felt_const_185998603 = felt.const 185998603 : <"babybear"> + %felt_const_1589437022 = felt.const 1589437022 : <"babybear"> + %felt_const_3735517662 = felt.const 3735517662 : <"babybear"> + %felt_const_338181140 = felt.const 338181140 : <"babybear"> + %felt_const_3094074296 = felt.const 3094074296 : <"babybear"> + %felt_const_4006029806 = felt.const 4006029806 : <"babybear"> + %felt_const_1183631942 = felt.const 1183631942 : <"babybear"> + %felt_const_2282455944 = felt.const 2282455944 : <"babybear"> + %felt_const_2419829648 = felt.const 2419829648 : <"babybear"> + %felt_const_710180394 = felt.const 710180394 : <"babybear"> + %felt_const_574907938 = felt.const 574907938 : <"babybear"> + %felt_const_3701702620 = felt.const 3701702620 : <"babybear"> + %felt_const_1335808335 = felt.const 1335808335 : <"babybear"> + %felt_const_2165938305 = felt.const 2165938305 : <"babybear"> + %felt_const_1623236704 = felt.const 1623236704 : <"babybear"> + %felt_const_1944491379 = felt.const 1944491379 : <"babybear"> + %felt_const_422718233 = felt.const 422718233 : <"babybear"> + %felt_const_1572530013 = felt.const 1572530013 : <"babybear"> + %felt_const_1690872932 = felt.const 1690872932 : <"babybear"> + %felt_const_1031423805 = felt.const 1031423805 : <"babybear"> + %felt_const_2130477694 = felt.const 2130477694 : <"babybear"> + %felt_const_2807427751 = felt.const 2807427751 : <"babybear"> + %felt_const_3297990596 = felt.const 3297990596 : <"babybear"> + %felt_const_388905239 = felt.const 388905239 : <"babybear"> + %felt_const_1149815876 = felt.const 1149815876 : <"babybear"> + %felt_const_2536874647 = felt.const 2536874647 : <"babybear"> + %felt_const_1606345055 = felt.const 1606345055 : <"babybear"> + %felt_const_3972214764 = felt.const 3972214764 : <"babybear"> + %felt_const_321271059 = felt.const 321271059 : <"babybear"> + %felt_const_202904588 = felt.const 202904588 : <"babybear"> + %felt_const_3447803085 = felt.const 3447803085 : <"babybear"> + %felt_const_3535760850 = felt.const 3535760850 : <"babybear"> + %felt_const_4093447923 = felt.const 4093447923 : <"babybear"> + %felt_const_4293204735 = felt.const 4293204735 : <"babybear"> + %felt_const_270544912 = felt.const 270544912 : <"babybear"> + %felt_const_557998881 = felt.const 557998881 : <"babybear"> + %felt_const_3668932058 = felt.const 3668932058 : <"babybear"> + %felt_const_3061301686 = felt.const 3061301686 : <"babybear"> + %felt_const_3160661948 = felt.const 3160661948 : <"babybear"> + %felt_const_4126213365 = felt.const 4126213365 : <"babybear"> + %felt_const_946882616 = felt.const 946882616 : <"babybear"> + %felt_const_2636233885 = felt.const 2636233885 : <"babybear"> + %felt_const_2453646738 = felt.const 2453646738 : <"babybear"> + %felt_const_2399505039 = felt.const 2399505039 : <"babybear"> + %felt_const_1082179648 = felt.const 1082179648 : <"babybear"> + %felt_const_2740846243 = felt.const 2740846243 : <"babybear"> + %felt_const_1369633617 = felt.const 1369633617 : <"babybear"> + %felt_const_2823545768 = felt.const 2823545768 : <"babybear"> + %felt_const_2670049951 = felt.const 2670049951 : <"babybear"> + %felt_const_1014514748 = felt.const 1014514748 : <"babybear"> + %felt_const_1352724560 = felt.const 1352724560 : <"babybear"> + %felt_const_2147385727 = felt.const 2147385727 : <"babybear"> + %felt_const_33818114 = felt.const 33818114 : <"babybear"> + %felt_const_4192801017 = felt.const 4192801017 : <"babybear"> + %felt_const_1166724933 = felt.const 1166724933 : <"babybear"> + %felt_const_2232521861 = felt.const 2232521861 : <"babybear"> + %felt_const_862344499 = felt.const 862344499 : <"babybear"> + %felt_const_1301993293 = felt.const 1301993293 : <"babybear"> + %felt_const_1132905795 = felt.const 1132905795 : <"babybear"> + %felt_const_4226619131 = felt.const 4226619131 : <"babybear"> + %felt_const_2857362858 = felt.const 2857362858 : <"babybear"> + %felt_const_4022676207 = felt.const 4022676207 : <"babybear"> + %felt_const_3501943760 = felt.const 3501943760 : <"babybear"> + %felt_const_3481619151 = felt.const 3481619151 : <"babybear"> + %felt_const_1487988824 = felt.const 1487988824 : <"babybear"> + %felt_const_1285084236 = felt.const 1285084236 : <"babybear"> + %felt_const_1251270218 = felt.const 1251270218 : <"babybear"> + %felt_const_963791673 = felt.const 963791673 : <"babybear"> + %felt_const_3194476990 = felt.const 3194476990 : <"babybear"> + %felt_const_3415033547 = felt.const 3415033547 : <"babybear"> + %felt_const_1792327274 = felt.const 1792327274 : <"babybear"> + %felt_const_1538714971 = felt.const 1538714971 : <"babybear"> + %felt_const_2977548465 = felt.const 2977548465 : <"babybear"> + %felt_const_4242743292 = felt.const 4242743292 : <"babybear"> + %felt_const_541089824 = felt.const 541089824 : <"babybear"> + %felt_const_3988860141 = felt.const 3988860141 : <"babybear"> + %felt_const_3518589137 = felt.const 3518589137 : <"babybear"> + %felt_const_1403450707 = felt.const 1403450707 : <"babybear"> + %felt_const_2215876484 = felt.const 2215876484 : <"babybear"> + %felt_const_794718511 = felt.const 794718511 : <"babybear"> + %felt_const_3822927587 = felt.const 3822927587 : <"babybear"> + %felt_const_693271337 = felt.const 693271337 : <"babybear"> + %felt_const_3011366579 = felt.const 3011366579 : <"babybear"> + %felt_const_3602342358 = felt.const 3602342358 : <"babybear"> + %felt_const_997608763 = felt.const 997608763 : <"babybear"> + %felt_const_1386542674 = felt.const 1386542674 : <"babybear"> + %felt_const_2690382752 = felt.const 2690382752 : <"babybear"> + %felt_const_1521806938 = felt.const 1521806938 : <"babybear"> + %felt_const_1859957358 = felt.const 1859957358 : <"babybear"> + %felt_const_456535323 = felt.const 456535323 : <"babybear"> + %felt_const_439627290 = felt.const 439627290 : <"babybear"> + %felt_const_743994412 = felt.const 743994412 : <"babybear"> + %felt_const_2199756419 = felt.const 2199756419 : <"babybear"> + %felt_const_152181513 = felt.const 152181513 : <"babybear"> + %felt_const_1978310517 = felt.const 1978310517 : <"babybear"> + %felt_const_2994720178 = felt.const 2994720178 : <"babybear"> + %felt_const_659450151 = felt.const 659450151 : <"babybear"> + %felt_const_3956090603 = felt.const 3956090603 : <"babybear"> + %felt_const_3806281186 = felt.const 3806281186 : <"babybear"> + %felt_const_2149292928 = felt.const 2149292928 : <"babybear"> + %felt_const_304363026 = felt.const 304363026 : <"babybear"> + %felt_const_118360327 = felt.const 118360327 : <"babybear"> + %felt_const_2586817946 = felt.const 2586817946 : <"babybear"> + %felt_const_84545285 = felt.const 84545285 : <"babybear"> + %felt_const_2520228246 = felt.const 2520228246 : <"babybear"> + %felt_const_405809176 = felt.const 405809176 : <"babybear"> + %felt_const_3281870531 = felt.const 3281870531 : <"babybear"> + %felt_const_591815971 = felt.const 591815971 : <"babybear"> + %felt_const_3348452039 = felt.const 3348452039 : <"babybear"> + %felt_const_67636228 = felt.const 67636228 : <"babybear"> + %felt_const_355090197 = felt.const 355090197 : <"babybear"> + %felt_const_828527409 = felt.const 828527409 : <"babybear"> + %felt_const_3635114968 = felt.const 3635114968 : <"babybear"> + %felt_const_1910674289 = felt.const 1910674289 : <"babybear"> + %felt_const_4059629809 = felt.const 4059629809 : <"babybear"> + %felt_const_3855693029 = felt.const 3855693029 : <"babybear"> + %felt_const_2773611685 = felt.const 2773611685 : <"babybear"> + %felt_const_879254580 = felt.const 879254580 : <"babybear"> + %felt_const_3431157708 = felt.const 3431157708 : <"babybear"> + %felt_const_4160029431 = felt.const 4160029431 : <"babybear"> + %felt_const_1065238847 = felt.const 1065238847 : <"babybear"> + %felt_const_913070646 = felt.const 913070646 : <"babybear"> + %felt_const_642542118 = felt.const 642542118 : <"babybear"> + %felt_const_2470293139 = felt.const 2470293139 : <"babybear"> + %felt_const_4259388669 = felt.const 4259388669 : <"babybear"> + %felt_const_3077948087 = felt.const 3077948087 : <"babybear"> + %felt_const_3231407040 = felt.const 3231407040 : <"babybear"> + %felt_const_1927583346 = felt.const 1927583346 : <"babybear"> + %felt_const_2756966308 = felt.const 2756966308 : <"babybear"> + %felt_const_2619588508 = felt.const 2619588508 : <"babybear"> + %felt_const_2940594863 = felt.const 2940594863 : <"babybear"> + %felt_const_2724199842 = felt.const 2724199842 : <"babybear"> + %felt_const_3568527316 = felt.const 3568527316 : <"babybear"> + %felt_const_2906778797 = felt.const 2906778797 : <"babybear"> + %felt_const_4042984432 = felt.const 4042984432 : <"babybear"> + %felt_const_1200539975 = felt.const 1200539975 : <"babybear"> + %felt_const_1504897881 = felt.const 1504897881 : <"babybear"> + %felt_const_4209972730 = felt.const 4209972730 : <"babybear"> + %felt_const_2113570685 = felt.const 2113570685 : <"babybear"> + %felt_const_3381215433 = felt.const 3381215433 : <"babybear"> + %felt_const_2183110018 = felt.const 2183110018 : <"babybear"> + %felt_const_3398387146 = felt.const 3398387146 : <"babybear"> + %felt_const_1995217526 = felt.const 1995217526 : <"babybear"> + %felt_const_2874009259 = felt.const 2874009259 : <"babybear"> + %felt_const_3618988759 = felt.const 3618988759 : <"babybear"> + %felt_const_4276558334 = felt.const 4276558334 : <"babybear"> + %felt_const_727088427 = felt.const 727088427 : <"babybear"> + %felt_const_1741597031 = felt.const 1741597031 : <"babybear"> + %felt_const_16909057 = felt.const 16909057 : <"babybear"> + %felt_const_811618352 = felt.const 811618352 : <"babybear"> + %felt_const_3314635973 = felt.const 3314635973 : <"babybear"> + %felt_const_1876865391 = felt.const 1876865391 : <"babybear"> + %felt_const_1809235307 = felt.const 1809235307 : <"babybear"> + %felt_const_4076801522 = felt.const 4076801522 : <"babybear"> + %felt_const_2079755643 = felt.const 2079755643 : <"babybear"> + %felt_const_2012125559 = felt.const 2012125559 : <"babybear"> + %felt_const_2096661628 = felt.const 2096661628 : <"babybear"> + %felt_const_1673962851 = felt.const 1673962851 : <"babybear"> + %felt_const_370551866 = felt.const 370551866 : <"babybear"> + %felt_const_3149622742 = felt.const 3149622742 : <"babybear"> + %felt_const_1414834428 = felt.const 1414834428 : <"babybear"> + %felt_const_2964356043 = felt.const 2964356043 : <"babybear"> + %felt_const_252648977 = felt.const 252648977 : <"babybear"> + %felt_const_757946999 = felt.const 757946999 : <"babybear"> + %felt_const_2576951728 = felt.const 2576951728 : <"babybear"> + %felt_const_1094812355 = felt.const 1094812355 : <"babybear"> + %felt_const_1751699640 = felt.const 1751699640 : <"babybear"> + %felt_const_1111655622 = felt.const 1111655622 : <"babybear"> + %felt_const_3873888049 = felt.const 3873888049 : <"babybear"> + %felt_const_3216991706 = felt.const 3216991706 : <"babybear"> + %felt_const_218962455 = felt.const 218962455 : <"babybear"> + %felt_const_2307459456 = felt.const 2307459456 : <"babybear"> + %felt_const_2711706104 = felt.const 2711706104 : <"babybear"> + %felt_const_2357986191 = felt.const 2357986191 : <"babybear"> + %felt_const_3755976058 = felt.const 3755976058 : <"babybear"> + %felt_const_673730680 = felt.const 673730680 : <"babybear"> + %felt_const_1431677695 = felt.const 1431677695 : <"babybear"> + %felt_const_3469641545 = felt.const 3469641545 : <"babybear"> + %felt_const_3924412704 = felt.const 3924412704 : <"babybear"> + %felt_const_2273777042 = felt.const 2273777042 : <"babybear"> + %felt_const_505297954 = felt.const 505297954 : <"babybear"> + %felt_const_2610638262 = felt.const 2610638262 : <"babybear"> + %felt_const_2492740519 = felt.const 2492740519 : <"babybear"> + %felt_const_2391672713 = felt.const 2391672713 : <"babybear"> + %felt_const_3654920560 = felt.const 3654920560 : <"babybear"> + %felt_const_1768542907 = felt.const 1768542907 : <"babybear"> + %felt_const_286335539 = felt.const 286335539 : <"babybear"> + %felt_const_2560109491 = felt.const 2560109491 : <"babybear"> + %felt_const_4177062675 = felt.const 4177062675 : <"babybear"> + %felt_const_3789674808 = felt.const 3789674808 : <"babybear"> + %felt_const_2661164985 = felt.const 2661164985 : <"babybear"> + %felt_const_488454695 = felt.const 488454695 : <"babybear"> + %felt_const_3250690392 = felt.const 3250690392 : <"babybear"> + %felt_const_2256934801 = felt.const 2256934801 : <"babybear"> + %felt_const_3115936208 = felt.const 3115936208 : <"babybear"> + %felt_const_1465364217 = felt.const 1465364217 : <"babybear"> + %felt_const_892693087 = felt.const 892693087 : <"babybear"> + %felt_const_1633796771 = felt.const 1633796771 : <"babybear"> + %felt_const_235805714 = felt.const 235805714 : <"babybear"> + %felt_const_4143380225 = felt.const 4143380225 : <"babybear"> + %felt_const_50529797 = felt.const 50529797 : <"babybear"> + %felt_const_1212715224 = felt.const 1212715224 : <"babybear"> + %felt_const_1718013098 = felt.const 1718013098 : <"babybear"> + %felt_const_3048567236 = felt.const 3048567236 : <"babybear"> + %felt_const_1044282434 = felt.const 1044282434 : <"babybear"> + %felt_const_1886445712 = felt.const 1886445712 : <"babybear"> + %felt_const_2324303749 = felt.const 2324303749 : <"babybear"> + %felt_const_2341145990 = felt.const 2341145990 : <"babybear"> + %felt_const_3183305180 = felt.const 3183305180 : <"babybear"> + %felt_const_1263245021 = felt.const 1263245021 : <"babybear"> + %felt_const_522141217 = felt.const 522141217 : <"babybear"> + %felt_const_1953818780 = felt.const 1953818780 : <"babybear"> + %felt_const_3722289532 = felt.const 3722289532 : <"babybear"> + %felt_const_3907570467 = felt.const 3907570467 : <"babybear"> + %felt_const_3334903633 = felt.const 3334903633 : <"babybear"> + %felt_const_3031724999 = felt.const 3031724999 : <"babybear"> + %felt_const_2795919345 = felt.const 2795919345 : <"babybear"> + %felt_const_471611428 = felt.const 471611428 : <"babybear"> + %felt_const_774790258 = felt.const 774790258 : <"babybear"> + %felt_const_623200879 = felt.const 623200879 : <"babybear"> + %felt_const_2021191816 = felt.const 2021191816 : <"babybear"> + %felt_const_3132780501 = felt.const 3132780501 : <"babybear"> + %felt_const_134746136 = felt.const 134746136 : <"babybear"> + %felt_const_2930657257 = felt.const 2930657257 : <"babybear"> + %felt_const_2054878350 = felt.const 2054878350 : <"babybear"> + %felt_const_1701169839 = felt.const 1701169839 : <"babybear"> + %felt_const_3941256997 = felt.const 3941256997 : <"babybear"> + %felt_const_4109693703 = felt.const 4109693703 : <"babybear"> + %felt_const_1448520954 = felt.const 1448520954 : <"babybear"> + %felt_const_1819072692 = felt.const 1819072692 : <"babybear"> + %felt_const_2846444000 = felt.const 2846444000 : <"babybear"> + %felt_const_1313774802 = felt.const 1313774802 : <"babybear"> + %felt_const_3587551588 = felt.const 3587551588 : <"babybear"> + %felt_const_2374828428 = felt.const 2374828428 : <"babybear"> + %felt_const_1835915959 = felt.const 1835915959 : <"babybear"> + %felt_const_926379609 = felt.const 926379609 : <"babybear"> + %felt_const_3368586051 = felt.const 3368586051 : <"babybear"> + %felt_const_3890730290 = felt.const 3890730290 : <"babybear"> + %felt_const_2038035083 = felt.const 2038035083 : <"babybear"> + %felt_const_3840201527 = felt.const 3840201527 : <"babybear"> + %felt_const_2509582756 = felt.const 2509582756 : <"babybear"> + %felt_const_2442213800 = felt.const 2442213800 : <"babybear"> + %felt_const_1650640038 = felt.const 1650640038 : <"babybear"> + %felt_const_2896970735 = felt.const 2896970735 : <"babybear"> + %felt_const_3553869166 = felt.const 3553869166 : <"babybear"> + %felt_const_3267534685 = felt.const 3267534685 : <"babybear"> + %felt_const_1549580516 = felt.const 1549580516 : <"babybear"> + %felt_const_606357612 = felt.const 606357612 : <"babybear"> + %felt_const_101059594 = felt.const 101059594 : <"babybear"> + %felt_const_1229558491 = felt.const 1229558491 : <"babybear"> + %felt_const_168432670 = felt.const 168432670 : <"babybear"> + %felt_const_976909390 = felt.const 976909390 : <"babybear"> + %felt_const_842163286 = felt.const 842163286 : <"babybear"> + %felt_const_3772832571 = felt.const 3772832571 : <"babybear"> + %felt_const_3688607094 = felt.const 3688607094 : <"babybear"> + %felt_const_185275933 = felt.const 185275933 : <"babybear"> + %felt_const_1583267042 = felt.const 1583267042 : <"babybear"> + %felt_const_3739133817 = felt.const 3739133817 : <"babybear"> + %felt_const_336865340 = felt.const 336865340 : <"babybear"> + %felt_const_3099093971 = felt.const 3099093971 : <"babybear"> + %felt_const_4008625961 = felt.const 4008625961 : <"babybear"> + %felt_const_1179028682 = felt.const 1179028682 : <"babybear"> + %felt_const_2290617219 = felt.const 2290617219 : <"babybear"> + %felt_const_2425371563 = felt.const 2425371563 : <"babybear"> + %felt_const_707417214 = felt.const 707417214 : <"babybear"> + %felt_const_572671078 = felt.const 572671078 : <"babybear"> + %felt_const_3705447295 = felt.const 3705447295 : <"babybear"> + %felt_const_1330618065 = felt.const 1330618065 : <"babybear"> + %felt_const_2172721560 = felt.const 2172721560 : <"babybear"> + %felt_const_1616953504 = felt.const 1616953504 : <"babybear"> + %felt_const_1936975509 = felt.const 1936975509 : <"babybear"> + %felt_const_421081643 = felt.const 421081643 : <"babybear"> + %felt_const_1566423783 = felt.const 1566423783 : <"babybear"> + %felt_const_1684326572 = felt.const 1684326572 : <"babybear"> + %felt_const_1027439175 = felt.const 1027439175 : <"babybear"> + %felt_const_2122251394 = felt.const 2122251394 : <"babybear"> + %felt_const_2812761586 = felt.const 2812761586 : <"babybear"> + %felt_const_3301217111 = felt.const 3301217111 : <"babybear"> + %felt_const_387395129 = felt.const 387395129 : <"babybear"> + %felt_const_1145342156 = felt.const 1145342156 : <"babybear"> + %felt_const_2543269282 = felt.const 2543269282 : <"babybear"> + %felt_const_1600110305 = felt.const 1600110305 : <"babybear"> + %felt_const_3974939439 = felt.const 3974939439 : <"babybear"> + %felt_const_320022069 = felt.const 320022069 : <"babybear"> + %felt_const_202119188 = felt.const 202119188 : <"babybear"> + %felt_const_3452797260 = felt.const 3452797260 : <"babybear"> + %felt_const_3537026925 = felt.const 3537026925 : <"babybear"> + %felt_const_4092853518 = felt.const 4092853518 : <"babybear"> + %felt_const_4294960410 = felt.const 4294960410 : <"babybear"> + %felt_const_269492272 = felt.const 269492272 : <"babybear"> + %felt_const_555827811 = felt.const 555827811 : <"babybear"> + %felt_const_3671764853 = felt.const 3671764853 : <"babybear"> + %felt_const_3065411521 = felt.const 3065411521 : <"babybear"> + %felt_const_3166462943 = felt.const 3166462943 : <"babybear"> + %felt_const_4126535940 = felt.const 4126535940 : <"babybear"> + %felt_const_943222856 = felt.const 943222856 : <"babybear"> + %felt_const_2644320700 = felt.const 2644320700 : <"babybear"> + %felt_const_2459058093 = felt.const 2459058093 : <"babybear"> + %felt_const_2408514954 = felt.const 2408514954 : <"babybear"> + %felt_const_1077969088 = felt.const 1077969088 : <"babybear"> + %felt_const_2745392638 = felt.const 2745392638 : <"babybear"> + %felt_const_1364304627 = felt.const 1364304627 : <"babybear"> + %felt_const_2829601763 = felt.const 2829601763 : <"babybear"> + %felt_const_2678007226 = felt.const 2678007226 : <"babybear"> + %felt_const_1010595908 = felt.const 1010595908 : <"babybear"> + %felt_const_1347461360 = felt.const 1347461360 : <"babybear"> + %felt_const_2139094657 = felt.const 2139094657 : <"babybear"> + %felt_const_33686534 = felt.const 33686534 : <"babybear"> + %felt_const_4193904912 = felt.const 4193904912 : <"babybear"> + %felt_const_1162185423 = felt.const 1162185423 : <"babybear"> + %felt_const_2240090516 = felt.const 2240090516 : <"babybear"> + %felt_const_859006549 = felt.const 859006549 : <"babybear"> + %felt_const_1296931543 = felt.const 1296931543 : <"babybear"> + %felt_const_1128498885 = felt.const 1128498885 : <"babybear"> + %felt_const_4227591446 = felt.const 4227591446 : <"babybear"> + %felt_const_2863288293 = felt.const 2863288293 : <"babybear"> + %felt_const_4025468202 = felt.const 4025468202 : <"babybear"> + %felt_const_3503340395 = felt.const 3503340395 : <"babybear"> + %felt_const_3486483786 = felt.const 3486483786 : <"babybear"> + %felt_const_1482207464 = felt.const 1482207464 : <"babybear"> + %felt_const_1280088276 = felt.const 1280088276 : <"babybear"> + %felt_const_1246401758 = felt.const 1246401758 : <"babybear"> + %felt_const_960066123 = felt.const 960066123 : <"babybear"> + %felt_const_3200149465 = felt.const 3200149465 : <"babybear"> + %felt_const_3419114822 = felt.const 3419114822 : <"babybear"> + %felt_const_1785386174 = felt.const 1785386174 : <"babybear"> + %felt_const_1532737261 = felt.const 1532737261 : <"babybear"> + %felt_const_2981198280 = felt.const 2981198280 : <"babybear"> + %felt_const_4244431647 = felt.const 4244431647 : <"babybear"> + %felt_const_538984544 = felt.const 538984544 : <"babybear"> + %felt_const_3991781676 = felt.const 3991781676 : <"babybear"> + %felt_const_3520182632 = felt.const 3520182632 : <"babybear"> + %felt_const_1397991157 = felt.const 1397991157 : <"babybear"> + %felt_const_2223248279 = felt.const 2223248279 : <"babybear"> + %felt_const_791633521 = felt.const 791633521 : <"babybear"> + %felt_const_3823361342 = felt.const 3823361342 : <"babybear"> + %felt_const_690573947 = felt.const 690573947 : <"babybear"> + %felt_const_3014884814 = felt.const 3014884814 : <"babybear"> + %felt_const_3604395873 = felt.const 3604395873 : <"babybear"> + %felt_const_993752653 = felt.const 993752653 : <"babybear"> + %felt_const_1381147894 = felt.const 1381147894 : <"babybear"> + %felt_const_2694863867 = felt.const 2694863867 : <"babybear"> + %felt_const_1515893998 = felt.const 1515893998 : <"babybear"> + %felt_const_1852759218 = felt.const 1852759218 : <"babybear"> + %felt_const_454768173 = felt.const 454768173 : <"babybear"> + %felt_const_437924910 = felt.const 437924910 : <"babybear"> + %felt_const_741103732 = felt.const 741103732 : <"babybear"> + %felt_const_2206408094 = felt.const 2206408094 : <"babybear"> + %felt_const_151589403 = felt.const 151589403 : <"babybear"> + %felt_const_1970662047 = felt.const 1970662047 : <"babybear"> + %felt_const_2998042573 = felt.const 2998042573 : <"babybear"> + %felt_const_656887401 = felt.const 656887401 : <"babybear"> + %felt_const_3958099238 = felt.const 3958099238 : <"babybear"> + %felt_const_3806519101 = felt.const 3806519101 : <"babybear"> + %felt_const_2155879323 = felt.const 2155879323 : <"babybear"> + %felt_const_303178806 = felt.const 303178806 : <"babybear"> + %felt_const_117902857 = felt.const 117902857 : <"babybear"> + %felt_const_2593796021 = felt.const 2593796021 : <"babybear"> + %felt_const_84216335 = felt.const 84216335 : <"babybear"> + %felt_const_2526427041 = felt.const 2526427041 : <"babybear"> + %felt_const_404238376 = felt.const 404238376 : <"babybear"> + %felt_const_3284376926 = felt.const 3284376926 : <"babybear"> + %felt_const_589514341 = felt.const 589514341 : <"babybear"> + %felt_const_3351745874 = felt.const 3351745874 : <"babybear"> + %felt_const_67373068 = felt.const 67373068 : <"babybear"> + %felt_const_353708607 = felt.const 353708607 : <"babybear"> + %felt_const_825320019 = felt.const 825320019 : <"babybear"> + %felt_const_3638078323 = felt.const 3638078323 : <"babybear"> + %felt_const_1903288979 = felt.const 1903288979 : <"babybear"> + %felt_const_4059166984 = felt.const 4059166984 : <"babybear"> + %felt_const_3857043764 = felt.const 3857043764 : <"babybear"> + %felt_const_2779075060 = felt.const 2779075060 : <"babybear"> + %felt_const_875849820 = felt.const 875849820 : <"babybear"> + %felt_const_3435955023 = felt.const 3435955023 : <"babybear"> + %felt_const_4160222466 = felt.const 4160222466 : <"babybear"> + %felt_const_1061125697 = felt.const 1061125697 : <"babybear"> + %felt_const_909536346 = felt.const 909536346 : <"babybear"> + %felt_const_640044138 = felt.const 640044138 : <"babybear"> + %felt_const_2475900334 = felt.const 2475900334 : <"babybear"> + %felt_const_4261273884 = felt.const 4261273884 : <"babybear"> + %felt_const_3082253762 = felt.const 3082253762 : <"babybear"> + %felt_const_3233848155 = felt.const 3233848155 : <"babybear"> + %felt_const_1920132246 = felt.const 1920132246 : <"babybear"> + %felt_const_2762232823 = felt.const 2762232823 : <"babybear"> + %felt_const_2627478463 = felt.const 2627478463 : <"babybear"> + %felt_const_2947499498 = felt.const 2947499498 : <"babybear"> + %felt_const_2728550397 = felt.const 2728550397 : <"babybear"> + %felt_const_3570709351 = felt.const 3570709351 : <"babybear"> + %felt_const_2913812972 = felt.const 2913812972 : <"babybear"> + %felt_const_4042324747 = felt.const 4042324747 : <"babybear"> + %felt_const_1195871945 = felt.const 1195871945 : <"babybear"> + %felt_const_1499050731 = felt.const 1499050731 : <"babybear"> + %felt_const_4210749205 = felt.const 4210749205 : <"babybear"> + %felt_const_2105408135 = felt.const 2105408135 : <"babybear"> + %felt_const_3385428288 = felt.const 3385428288 : <"babybear"> + %felt_const_2189565853 = felt.const 2189565853 : <"babybear"> + %felt_const_3402272581 = felt.const 3402272581 : <"babybear"> + %felt_const_1987505306 = felt.const 1987505306 : <"babybear"> + %felt_const_2880130534 = felt.const 2880130534 : <"babybear"> + %felt_const_3621238114 = felt.const 3621238114 : <"babybear"> + %felt_const_4278118169 = felt.const 4278118169 : <"babybear"> + %felt_const_724260477 = felt.const 724260477 : <"babybear"> + %felt_const_1734856361 = felt.const 1734856361 : <"babybear"> + %felt_const_16843267 = felt.const 16843267 : <"babybear"> + %felt_const_808476752 = felt.const 808476752 : <"babybear"> + %felt_const_3318059348 = felt.const 3318059348 : <"babybear"> + %felt_const_1869602481 = felt.const 1869602481 : <"babybear"> + %felt_const_1802229437 = felt.const 1802229437 : <"babybear"> + %felt_const_4076011277 = felt.const 4076011277 : <"babybear"> + %felt_const_2071721613 = felt.const 2071721613 : <"babybear"> + %felt_const_2004348569 = felt.const 2004348569 : <"babybear"> + %felt_const_2088564868 = felt.const 2088564868 : <"babybear"> + %felt_const_1667483301 = felt.const 1667483301 : <"babybear"> + %felt_const_974525996 = felt.const 974525996 : <"babybear"> + %felt_const_3602627437 = felt.const 3602627437 : <"babybear"> + %felt_const_4233385128 = felt.const 4233385128 : <"babybear"> + %felt_const_3417354363 = felt.const 3417354363 : <"babybear"> + %felt_const_286199582 = felt.const 286199582 : <"babybear"> + %felt_const_1999449434 = felt.const 1999449434 : <"babybear"> + %felt_const_2962856233 = felt.const 2962856233 : <"babybear"> + %felt_const_3275833730 = felt.const 3275833730 : <"babybear"> + %felt_const_3093850320 = felt.const 3093850320 : <"babybear"> + %felt_const_3326231172 = felt.const 3326231172 : <"babybear"> + %felt_const_837215959 = felt.const 837215959 : <"babybear"> + %felt_const_3669999461 = felt.const 3669999461 : <"babybear"> + %felt_const_386731290 = felt.const 386731290 : <"babybear"> + %felt_const_2156497161 = felt.const 2156497161 : <"babybear"> + %felt_const_4171342169 = felt.const 4171342169 : <"babybear"> + %felt_const_2408352771 = felt.const 2408352771 : <"babybear"> + %felt_const_2061492133 = felt.const 2061492133 : <"babybear"> + %felt_const_2015897680 = felt.const 2015897680 : <"babybear"> + %felt_const_4283782570 = felt.const 4283782570 : <"babybear"> + %felt_const_1238290055 = felt.const 1238290055 : <"babybear"> + %felt_const_552200649 = felt.const 552200649 : <"babybear"> + %felt_const_2458355477 = felt.const 2458355477 : <"babybear"> + %felt_const_572399164 = felt.const 572399164 : <"babybear"> + %felt_const_3063651117 = felt.const 3063651117 : <"babybear"> + %felt_const_2811532339 = felt.const 2811532339 : <"babybear"> + %felt_const_2307821063 = felt.const 2307821063 : <"babybear"> + %felt_const_1893325225 = felt.const 1893325225 : <"babybear"> + %felt_const_3144247762 = felt.const 3144247762 : <"babybear"> + %felt_const_856756514 = felt.const 856756514 : <"babybear"> + %felt_const_3013122091 = felt.const 3013122091 : <"babybear"> + %felt_const_335083755 = felt.const 335083755 : <"babybear"> + %felt_const_954327513 = felt.const 954327513 : <"babybear"> + %felt_const_3114180135 = felt.const 3114180135 : <"babybear"> + %felt_const_656219450 = felt.const 656219450 : <"babybear"> + %felt_const_1489093017 = felt.const 1489093017 : <"babybear"> + %felt_const_2441512471 = felt.const 2441512471 : <"babybear"> + %felt_const_3501832553 = felt.const 3501832553 : <"babybear"> + %felt_const_4183250862 = felt.const 4183250862 : <"babybear"> + %felt_const_1597322602 = felt.const 1597322602 : <"babybear"> + %felt_const_2741068226 = felt.const 2741068226 : <"babybear"> + %felt_const_302911004 = felt.const 302911004 : <"babybear"> + %felt_const_32962295 = felt.const 32962295 : <"babybear"> + %felt_const_84083462 = felt.const 84083462 : <"babybear"> + %felt_const_3628615824 = felt.const 3628615824 : <"babybear"> + %felt_const_2858837708 = felt.const 2858837708 : <"babybear"> + %felt_const_3300242801 = felt.const 3300242801 : <"babybear"> + %felt_const_1111375484 = felt.const 1111375484 : <"babybear"> + %felt_const_2423288032 = felt.const 2423288032 : <"babybear"> + %felt_const_2240449039 = felt.const 2240449039 : <"babybear"> + %felt_const_2257292045 = felt.const 2257292045 : <"babybear"> + %felt_const_3703422305 = felt.const 3703422305 : <"babybear"> + %felt_const_3712699286 = felt.const 3712699286 : <"babybear"> + %felt_const_555687742 = felt.const 555687742 : <"babybear"> + %felt_const_2624877800 = felt.const 2624877800 : <"babybear"> + %felt_const_2094914977 = felt.const 2094914977 : <"babybear"> + %felt_const_602466507 = felt.const 602466507 : <"babybear"> + %felt_const_1371981463 = felt.const 1371981463 : <"babybear"> + %felt_const_3350508659 = felt.const 3350508659 : <"babybear"> + %felt_const_4054230615 = felt.const 4054230615 : <"babybear"> + %felt_const_605822008 = felt.const 605822008 : <"babybear"> + %felt_const_1915629148 = felt.const 1915629148 : <"babybear"> + %felt_const_1864705354 = felt.const 1864705354 : <"babybear"> + %felt_const_2289596656 = felt.const 2289596656 : <"babybear"> + %felt_const_3585784431 = felt.const 3585784431 : <"babybear"> + %felt_const_403179536 = felt.const 403179536 : <"babybear"> + %felt_const_3920539207 = felt.const 3920539207 : <"babybear"> + %felt_const_2390391540 = felt.const 2390391540 : <"babybear"> + %felt_const_2942657994 = felt.const 2942657994 : <"babybear"> + %felt_const_636152527 = felt.const 636152527 : <"babybear"> + %felt_const_133494003 = felt.const 133494003 : <"babybear"> + %felt_const_4199962284 = felt.const 4199962284 : <"babybear"> + %felt_const_3027004632 = felt.const 3027004632 : <"babybear"> + %felt_const_3769215305 = felt.const 3769215305 : <"babybear"> + %felt_const_3528347292 = felt.const 3528347292 : <"babybear"> + %felt_const_1691735473 = felt.const 1691735473 : <"babybear"> + %felt_const_2358086913 = felt.const 2358086913 : <"babybear"> + %felt_const_3077402074 = felt.const 3077402074 : <"babybear"> + %felt_const_1496790894 = felt.const 1496790894 : <"babybear"> + %felt_const_1137232011 = felt.const 1137232011 : <"babybear"> + %felt_const_854058965 = felt.const 854058965 : <"babybear"> + %felt_const_2339994098 = felt.const 2339994098 : <"babybear"> + %felt_const_937747667 = felt.const 937747667 : <"babybear"> + %felt_const_2761266481 = felt.const 2761266481 : <"babybear"> + %felt_const_2828112185 = felt.const 2828112185 : <"babybear"> + %felt_const_2791465668 = felt.const 2791465668 : <"babybear"> + %felt_const_4021070915 = felt.const 4021070915 : <"babybear"> + %felt_const_1859376061 = felt.const 1859376061 : <"babybear"> + %felt_const_1573044895 = felt.const 1573044895 : <"babybear"> + %felt_const_3831258296 = felt.const 3831258296 : <"babybear"> + %felt_const_1814307912 = felt.const 1814307912 : <"babybear"> + %felt_const_168166924 = felt.const 168166924 : <"babybear"> + %felt_const_3679013266 = felt.const 3679013266 : <"babybear"> + %felt_const_503974420 = felt.const 503974420 : <"babybear"> + %felt_const_1312438900 = felt.const 1312438900 : <"babybear"> + %felt_const_1446130276 = felt.const 1446130276 : <"babybear"> + %felt_const_1004593371 = felt.const 1004593371 : <"babybear"> + %felt_const_1994120109 = felt.const 1994120109 : <"babybear"> + %felt_const_487262998 = felt.const 487262998 : <"babybear"> + %felt_const_3797835452 = felt.const 3797835452 : <"babybear"> + %felt_const_2044649127 = felt.const 2044649127 : <"babybear"> + %felt_const_1007948840 = felt.const 1007948840 : <"babybear"> + %felt_const_3552098411 = felt.const 3552098411 : <"babybear"> + %felt_const_703524551 = felt.const 703524551 : <"babybear"> + %felt_const_3393603212 = felt.const 3393603212 : <"babybear"> + %felt_const_2206763019 = felt.const 2206763019 : <"babybear"> + %felt_const_2878378043 = felt.const 2878378043 : <"babybear"> + %felt_const_2116692564 = felt.const 2116692564 : <"babybear"> + %felt_const_1713513028 = felt.const 1713513028 : <"babybear"> + %felt_const_2145180835 = felt.const 2145180835 : <"babybear"> + %felt_const_3511635870 = felt.const 3511635870 : <"babybear"> + %felt_const_2558624025 = felt.const 2558624025 : <"babybear"> + %felt_const_2690670784 = felt.const 2690670784 : <"babybear"> + %felt_const_2507371494 = felt.const 2507371494 : <"babybear"> + %felt_const_723065138 = felt.const 723065138 : <"babybear"> + %felt_const_3881655738 = felt.const 3881655738 : <"babybear"> + %felt_const_2892260552 = felt.const 2892260552 : <"babybear"> + %felt_const_1195195770 = felt.const 1195195770 : <"babybear"> + %felt_const_2189328124 = felt.const 2189328124 : <"babybear"> + %felt_const_4071073621 = felt.const 4071073621 : <"babybear"> + %felt_const_1472513171 = felt.const 1472513171 : <"babybear"> + %felt_const_957814574 = felt.const 957814574 : <"babybear"> + %felt_const_3427026056 = felt.const 3427026056 : <"babybear"> + %felt_const_2727843637 = felt.const 2727843637 : <"babybear"> + %felt_const_3781124030 = felt.const 3781124030 : <"babybear"> + %felt_const_804056259 = felt.const 804056259 : <"babybear"> + %felt_const_890442534 = felt.const 890442534 : <"babybear"> + %felt_const_336333848 = felt.const 336333848 : <"babybear"> + %felt_const_1288555905 = felt.const 1288555905 : <"babybear"> + %felt_const_1842533055 = felt.const 1842533055 : <"babybear"> + %felt_const_250868733 = felt.const 250868733 : <"babybear"> + %felt_const_452984805 = felt.const 452984805 : <"babybear"> + %felt_const_806359072 = felt.const 806359072 : <"babybear"> + %felt_const_1663115586 = felt.const 1663115586 : <"babybear"> + %felt_const_1977277103 = felt.const 1977277103 : <"babybear"> + %felt_const_3249976951 = felt.const 3249976951 : <"babybear"> + %felt_const_3753688163 = felt.const 3753688163 : <"babybear"> + %felt_const_83228145 = felt.const 83228145 : <"babybear"> + %felt_const_1211644016 = felt.const 1211644016 : <"babybear"> + %felt_const_3164445985 = felt.const 3164445985 : <"babybear"> + %felt_const_2912064063 = felt.const 2912064063 : <"babybear"> + %felt_const_2324664069 = felt.const 2324664069 : <"babybear"> + %felt_const_3225436288 = felt.const 3225436288 : <"babybear"> + %felt_const_4272137053 = felt.const 4272137053 : <"babybear"> + %felt_const_4082192802 = felt.const 4082192802 : <"babybear"> + %felt_const_3819481163 = felt.const 3819481163 : <"babybear"> + %felt_const_3131023141 = felt.const 3131023141 : <"babybear"> + %felt_const_1144798328 = felt.const 1144798328 : <"babybear"> + %felt_const_4031795360 = felt.const 4031795360 : <"babybear"> + %felt_const_2172616702 = felt.const 2172616702 : <"babybear"> + %felt_const_100794884 = felt.const 100794884 : <"babybear"> + %felt_const_284817897 = felt.const 284817897 : <"babybear"> + %felt_const_3477423498 = felt.const 3477423498 : <"babybear"> + %felt_const_2491778321 = felt.const 2491778321 : <"babybear"> + %felt_const_1429418854 = felt.const 1429418854 : <"babybear"> + %felt_const_3612167578 = felt.const 3612167578 : <"babybear"> + %felt_const_3309519750 = felt.const 3309519750 : <"babybear"> + %felt_const_385612781 = felt.const 385612781 : <"babybear"> + %felt_const_3853167183 = felt.const 3853167183 : <"babybear"> + %felt_const_720367557 = felt.const 720367557 : <"babybear"> + %felt_const_1808847035 = felt.const 1808847035 : <"babybear"> + %felt_const_1255133061 = felt.const 1255133061 : <"babybear"> + %felt_const_3898103984 = felt.const 3898103984 : <"babybear"> + %felt_const_3561770136 = felt.const 3561770136 : <"babybear"> + %felt_const_3729410708 = felt.const 3729410708 : <"babybear"> + %felt_const_1262041458 = felt.const 1262041458 : <"babybear"> + %felt_const_3653156455 = felt.const 3653156455 : <"babybear"> + %felt_const_1187761037 = felt.const 1187761037 : <"babybear"> + %felt_const_3194645204 = felt.const 3194645204 : <"babybear"> + %felt_const_3982187446 = felt.const 3982187446 : <"babybear"> + %felt_const_3367088505 = felt.const 3367088505 : <"babybear"> + %felt_const_536673507 = felt.const 536673507 : <"babybear"> + %felt_const_1612718144 = felt.const 1612718144 : <"babybear"> + %felt_const_753790401 = felt.const 753790401 : <"babybear"> + %felt_const_1758581177 = felt.const 1758581177 : <"babybear"> + %felt_const_4115878822 = felt.const 4115878822 : <"babybear"> + %felt_const_2542044179 = felt.const 2542044179 : <"babybear"> + %felt_const_1898917726 = felt.const 1898917726 : <"babybear"> + %felt_const_1055122397 = felt.const 1055122397 : <"babybear"> + %felt_const_2066295122 = felt.const 2066295122 : <"babybear"> + %felt_const_3467883389 = felt.const 3467883389 : <"babybear"> + %felt_const_1641469623 = felt.const 1641469623 : <"babybear"> + %felt_const_1295727478 = felt.const 1295727478 : <"babybear"> + %felt_const_4132590244 = felt.const 4132590244 : <"babybear"> + %felt_const_4221608027 = felt.const 4221608027 : <"babybear"> + %felt_const_3998898868 = felt.const 3998898868 : <"babybear"> + %felt_const_2993581788 = felt.const 2993581788 : <"babybear"> + %felt_const_756751158 = felt.const 756751158 : <"babybear"> + %felt_const_773462580 = felt.const 773462580 : <"babybear"> + %felt_const_1949051992 = felt.const 1949051992 : <"babybear"> + %felt_const_2659418909 = felt.const 2659418909 : <"babybear"> + %felt_const_453576978 = felt.const 453576978 : <"babybear"> + %felt_const_2675275242 = felt.const 2675275242 : <"babybear"> + %felt_const_3451040383 = felt.const 3451040383 : <"babybear"> + %felt_const_1764173646 = felt.const 1764173646 : <"babybear"> + %felt_const_652995533 = felt.const 652995533 : <"babybear"> + %felt_const_1038279391 = felt.const 1038279391 : <"babybear"> + %felt_const_2608889883 = felt.const 2608889883 : <"babybear"> + %felt_const_907153956 = felt.const 907153956 : <"babybear"> + %felt_const_151455502 = felt.const 151455502 : <"babybear"> + %felt_const_3046808111 = felt.const 3046808111 : <"babybear"> + %felt_const_251987210 = felt.const 251987210 : <"babybear"> + %felt_const_2711000631 = felt.const 2711000631 : <"babybear"> + %felt_const_672667696 = felt.const 672667696 : <"babybear"> + %felt_const_1589887901 = felt.const 1589887901 : <"babybear"> + %felt_const_1696801606 = felt.const 1696801606 : <"babybear"> + %felt_const_1388824469 = felt.const 1388824469 : <"babybear"> + %felt_const_201589768 = felt.const 201589768 : <"babybear"> + %felt_const_1058346282 = felt.const 1058346282 : <"babybear"> + %felt_const_1395732834 = felt.const 1395732834 : <"babybear"> + %felt_const_1943591083 = felt.const 1943591083 : <"babybear"> + %felt_const_2473685474 = felt.const 2473685474 : <"babybear"> + %felt_const_150073849 = felt.const 150073849 : <"babybear"> + %felt_const_887481809 = felt.const 887481809 : <"babybear"> + %felt_const_4104496465 = felt.const 4104496465 : <"babybear"> + %felt_const_1546925160 = felt.const 1546925160 : <"babybear"> + %felt_const_1338821763 = felt.const 1338821763 : <"babybear"> + %felt_const_49805301 = felt.const 49805301 : <"babybear"> + %felt_const_1094664062 = felt.const 1094664062 : <"babybear"> + %felt_const_1513502316 = felt.const 1513502316 : <"babybear"> + %felt_const_1780885068 = felt.const 1780885068 : <"babybear"> + %felt_const_2928907069 = felt.const 2928907069 : <"babybear"> + %felt_const_486407649 = felt.const 486407649 : <"babybear"> + %felt_const_3266819957 = felt.const 3266819957 : <"babybear"> + %felt_const_1539358875 = felt.const 1539358875 : <"babybear"> + %felt_const_2524082916 = felt.const 2524082916 : <"babybear"> + %felt_const_4154762323 = felt.const 4154762323 : <"babybear"> + %felt_const_3214711843 = felt.const 3214711843 : <"babybear"> + %felt_const_3937382213 = felt.const 3937382213 : <"babybear"> + %felt_const_4255294047 = felt.const 4255294047 : <"babybear"> + %felt_const_1742001331 = felt.const 1742001331 : <"babybear"> + %felt_const_3970805057 = felt.const 3970805057 : <"babybear"> + %felt_const_200339707 = felt.const 200339707 : <"babybear"> + %felt_const_3376891790 = felt.const 3376891790 : <"babybear"> + %felt_const_3948501426 = felt.const 3948501426 : <"babybear"> + %felt_const_368769775 = felt.const 368769775 : <"babybear"> + %felt_const_2273148410 = felt.const 2273148410 : <"babybear"> + %felt_const_1086966153 = felt.const 1086966153 : <"babybear"> + %felt_const_2642575903 = felt.const 2642575903 : <"babybear"> + %felt_const_1170918031 = felt.const 1170918031 : <"babybear"> + %felt_const_2591454956 = felt.const 2591454956 : <"babybear"> + %felt_const_3870010189 = felt.const 3870010189 : <"babybear"> + %felt_const_1658312629 = felt.const 1658312629 : <"babybear"> + %felt_const_436141799 = felt.const 436141799 : <"babybear"> + %felt_const_2099981142 = felt.const 2099981142 : <"babybear"> + %felt_const_2842126286 = felt.const 2842126286 : <"babybear"> + %felt_const_50397442 = felt.const 50397442 : <"babybear"> + %felt_const_1345335392 = felt.const 1345335392 : <"babybear"> + %felt_const_1422247313 = felt.const 1422247313 : <"babybear"> + %felt_const_2976870366 = felt.const 2976870366 : <"babybear"> + %felt_const_3177933782 = felt.const 3177933782 : <"babybear"> + %felt_const_234025727 = felt.const 234025727 : <"babybear"> + %felt_const_2373680118 = felt.const 2373680118 : <"babybear"> + %felt_const_2574743534 = felt.const 2574743534 : <"babybear"> + %felt_const_2222750968 = felt.const 2222750968 : <"babybear"> + %felt_const_2774754246 = felt.const 2774754246 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<4,256 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<256 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c100] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c101] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c102] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c103] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c104] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c105] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c106] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c107] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c108] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c109] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c110] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c111] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c112] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c113] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c114] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c115] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c116] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c117] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c118] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c119] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c120] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c121] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c122] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c123] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c124] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c125] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c126] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c127] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c128] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c129] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c130] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c131] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c132] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c133] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c134] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c135] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c136] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c137] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c138] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c139] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c140] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c141] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c142] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c143] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c144] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c145] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c146] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c147] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c148] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c149] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c150] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c151] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c152] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c153] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c154] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c155] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c156] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c157] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c158] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c159] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c160] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c161] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c162] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c163] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c164] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c165] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c166] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c167] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c168] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c169] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c170] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c171] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c172] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c173] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c174] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c175] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c176] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c177] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c178] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c179] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c180] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c181] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c182] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c183] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c184] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c185] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c186] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c187] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c188] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c189] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c190] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c191] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c192] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c193] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c194] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c195] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c196] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c197] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c198] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c199] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c200] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c201] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c202] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c203] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c204] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c205] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c206] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c207] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c208] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c209] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c210] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c211] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c212] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c213] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c214] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c215] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c216] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c217] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c218] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c219] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c220] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c221] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c222] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c223] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c224] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c225] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c226] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c227] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c228] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c229] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c230] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c231] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c232] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c233] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c234] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c235] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c236] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c237] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c238] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c239] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c240] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c241] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c242] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c243] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c244] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c245] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c246] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c247] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c248] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c249] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c250] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c251] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c252] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c253] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c255] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.insert %nondet[%c2] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.insert %nondet[%c3] = %nondet_0 : <4,256 x !felt.type<"babybear">>, <256 x !felt.type<"babybear">> + array.write %nondet[%c0, %c0] = %felt_const_2774754246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c1] = %felt_const_2222750968 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c2] = %felt_const_2574743534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c3] = %felt_const_2373680118 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c4] = %felt_const_234025727 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c5] = %felt_const_3177933782 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c6] = %felt_const_2976870366 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c7] = %felt_const_1422247313 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c8] = %felt_const_1345335392 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c9] = %felt_const_50397442 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c10] = %felt_const_2842126286 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c11] = %felt_const_2099981142 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c12] = %felt_const_436141799 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c13] = %felt_const_1658312629 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c14] = %felt_const_3870010189 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c15] = %felt_const_2591454956 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c16] = %felt_const_1170918031 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c17] = %felt_const_2642575903 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c18] = %felt_const_1086966153 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c19] = %felt_const_2273148410 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c20] = %felt_const_368769775 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c21] = %felt_const_3948501426 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c22] = %felt_const_3376891790 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c23] = %felt_const_200339707 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c24] = %felt_const_3970805057 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c25] = %felt_const_1742001331 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c26] = %felt_const_4255294047 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c27] = %felt_const_3937382213 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c28] = %felt_const_3214711843 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c29] = %felt_const_4154762323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c30] = %felt_const_2524082916 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c31] = %felt_const_1539358875 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c32] = %felt_const_3266819957 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c33] = %felt_const_486407649 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c34] = %felt_const_2928907069 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c35] = %felt_const_1780885068 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c36] = %felt_const_1513502316 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c37] = %felt_const_1094664062 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c38] = %felt_const_49805301 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c39] = %felt_const_1338821763 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c40] = %felt_const_1546925160 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c41] = %felt_const_4104496465 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c42] = %felt_const_887481809 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c43] = %felt_const_150073849 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c44] = %felt_const_2473685474 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c45] = %felt_const_1943591083 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c46] = %felt_const_1395732834 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c47] = %felt_const_1058346282 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c48] = %felt_const_201589768 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c49] = %felt_const_1388824469 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c50] = %felt_const_1696801606 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c51] = %felt_const_1589887901 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c52] = %felt_const_672667696 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c53] = %felt_const_2711000631 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c54] = %felt_const_251987210 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c55] = %felt_const_3046808111 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c56] = %felt_const_151455502 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c57] = %felt_const_907153956 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c58] = %felt_const_2608889883 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c59] = %felt_const_1038279391 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c60] = %felt_const_652995533 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c61] = %felt_const_1764173646 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c62] = %felt_const_3451040383 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c63] = %felt_const_2675275242 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c64] = %felt_const_453576978 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c65] = %felt_const_2659418909 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c66] = %felt_const_1949051992 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c67] = %felt_const_773462580 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c68] = %felt_const_756751158 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c69] = %felt_const_2993581788 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c70] = %felt_const_3998898868 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c71] = %felt_const_4221608027 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c72] = %felt_const_4132590244 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c73] = %felt_const_1295727478 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c74] = %felt_const_1641469623 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c75] = %felt_const_3467883389 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c76] = %felt_const_2066295122 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c77] = %felt_const_1055122397 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c78] = %felt_const_1898917726 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c79] = %felt_const_2542044179 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c80] = %felt_const_4115878822 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c81] = %felt_const_1758581177 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c83] = %felt_const_753790401 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c84] = %felt_const_1612718144 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c85] = %felt_const_536673507 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c86] = %felt_const_3367088505 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c87] = %felt_const_3982187446 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c88] = %felt_const_3194645204 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c89] = %felt_const_1187761037 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c90] = %felt_const_3653156455 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c91] = %felt_const_1262041458 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c92] = %felt_const_3729410708 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c93] = %felt_const_3561770136 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c94] = %felt_const_3898103984 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c95] = %felt_const_1255133061 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c96] = %felt_const_1808847035 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c97] = %felt_const_720367557 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c98] = %felt_const_3853167183 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c99] = %felt_const_385612781 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c100] = %felt_const_3309519750 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c101] = %felt_const_3612167578 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c102] = %felt_const_1429418854 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c103] = %felt_const_2491778321 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c104] = %felt_const_3477423498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c105] = %felt_const_284817897 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c106] = %felt_const_100794884 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c107] = %felt_const_2172616702 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c108] = %felt_const_4031795360 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c109] = %felt_const_1144798328 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c110] = %felt_const_3131023141 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c111] = %felt_const_3819481163 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c112] = %felt_const_4082192802 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c113] = %felt_const_4272137053 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c114] = %felt_const_3225436288 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c115] = %felt_const_2324664069 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c116] = %felt_const_2912064063 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c117] = %felt_const_3164445985 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c118] = %felt_const_1211644016 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c119] = %felt_const_83228145 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c120] = %felt_const_3753688163 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c121] = %felt_const_3249976951 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c122] = %felt_const_1977277103 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c123] = %felt_const_1663115586 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c124] = %felt_const_806359072 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c125] = %felt_const_452984805 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c126] = %felt_const_250868733 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c127] = %felt_const_1842533055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c128] = %felt_const_1288555905 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c129] = %felt_const_336333848 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c130] = %felt_const_890442534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c131] = %felt_const_804056259 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c132] = %felt_const_3781124030 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c133] = %felt_const_2727843637 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c134] = %felt_const_3427026056 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c135] = %felt_const_957814574 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c136] = %felt_const_1472513171 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c137] = %felt_const_4071073621 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c138] = %felt_const_2189328124 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c139] = %felt_const_1195195770 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c140] = %felt_const_2892260552 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c141] = %felt_const_3881655738 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c142] = %felt_const_723065138 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c143] = %felt_const_2507371494 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c144] = %felt_const_2690670784 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c145] = %felt_const_2558624025 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c146] = %felt_const_3511635870 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c147] = %felt_const_2145180835 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c148] = %felt_const_1713513028 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c149] = %felt_const_2116692564 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c150] = %felt_const_2878378043 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c151] = %felt_const_2206763019 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c152] = %felt_const_3393603212 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c153] = %felt_const_703524551 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c154] = %felt_const_3552098411 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c155] = %felt_const_1007948840 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c156] = %felt_const_2044649127 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c157] = %felt_const_3797835452 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c158] = %felt_const_487262998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c159] = %felt_const_1994120109 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c160] = %felt_const_1004593371 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c161] = %felt_const_1446130276 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c162] = %felt_const_1312438900 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c163] = %felt_const_503974420 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c164] = %felt_const_3679013266 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c165] = %felt_const_168166924 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c166] = %felt_const_1814307912 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c167] = %felt_const_3831258296 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c168] = %felt_const_1573044895 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c169] = %felt_const_1859376061 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c170] = %felt_const_4021070915 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c171] = %felt_const_2791465668 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c172] = %felt_const_2828112185 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c173] = %felt_const_2761266481 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c174] = %felt_const_937747667 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c175] = %felt_const_2339994098 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c176] = %felt_const_854058965 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c177] = %felt_const_1137232011 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c178] = %felt_const_1496790894 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c179] = %felt_const_3077402074 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c180] = %felt_const_2358086913 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c181] = %felt_const_1691735473 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c182] = %felt_const_3528347292 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c183] = %felt_const_3769215305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c184] = %felt_const_3027004632 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c185] = %felt_const_4199962284 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c186] = %felt_const_133494003 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c187] = %felt_const_636152527 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c188] = %felt_const_2942657994 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c189] = %felt_const_2390391540 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c190] = %felt_const_3920539207 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c191] = %felt_const_403179536 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c192] = %felt_const_3585784431 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c193] = %felt_const_2289596656 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c194] = %felt_const_1864705354 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c195] = %felt_const_1915629148 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c196] = %felt_const_605822008 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c197] = %felt_const_4054230615 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c198] = %felt_const_3350508659 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c199] = %felt_const_1371981463 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c200] = %felt_const_602466507 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c201] = %felt_const_2094914977 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c202] = %felt_const_2624877800 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c203] = %felt_const_555687742 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c204] = %felt_const_3712699286 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c205] = %felt_const_3703422305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c206] = %felt_const_2257292045 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c207] = %felt_const_2240449039 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c208] = %felt_const_2423288032 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c209] = %felt_const_1111375484 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c210] = %felt_const_3300242801 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c211] = %felt_const_2858837708 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c212] = %felt_const_3628615824 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c213] = %felt_const_84083462 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c214] = %felt_const_32962295 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c215] = %felt_const_302911004 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c216] = %felt_const_2741068226 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c217] = %felt_const_1597322602 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c218] = %felt_const_4183250862 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c219] = %felt_const_3501832553 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c220] = %felt_const_2441512471 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c221] = %felt_const_1489093017 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c222] = %felt_const_656219450 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c223] = %felt_const_3114180135 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c224] = %felt_const_954327513 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c225] = %felt_const_335083755 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c226] = %felt_const_3013122091 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c227] = %felt_const_856756514 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c228] = %felt_const_3144247762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c229] = %felt_const_1893325225 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c230] = %felt_const_2307821063 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c231] = %felt_const_2811532339 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c232] = %felt_const_3063651117 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c233] = %felt_const_572399164 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c234] = %felt_const_2458355477 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c235] = %felt_const_552200649 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c236] = %felt_const_1238290055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c237] = %felt_const_4283782570 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c238] = %felt_const_2015897680 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c239] = %felt_const_2061492133 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c240] = %felt_const_2408352771 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c241] = %felt_const_4171342169 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c242] = %felt_const_2156497161 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c243] = %felt_const_386731290 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c244] = %felt_const_3669999461 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c245] = %felt_const_837215959 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c246] = %felt_const_3326231172 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c247] = %felt_const_3093850320 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c248] = %felt_const_3275833730 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c249] = %felt_const_2962856233 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c250] = %felt_const_1999449434 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c251] = %felt_const_286199582 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c252] = %felt_const_3417354363 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c253] = %felt_const_4233385128 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c254] = %felt_const_3602627437 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0, %c255] = %felt_const_974525996 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c0] = %felt_const_1667483301 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c1] = %felt_const_2088564868 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c2] = %felt_const_2004348569 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c3] = %felt_const_2071721613 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c4] = %felt_const_4076011277 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c5] = %felt_const_1802229437 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c6] = %felt_const_1869602481 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c7] = %felt_const_3318059348 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c8] = %felt_const_808476752 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c9] = %felt_const_16843267 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c10] = %felt_const_1734856361 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c11] = %felt_const_724260477 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c12] = %felt_const_4278118169 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c13] = %felt_const_3621238114 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c14] = %felt_const_2880130534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c15] = %felt_const_1987505306 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c16] = %felt_const_3402272581 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c17] = %felt_const_2189565853 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c18] = %felt_const_3385428288 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c19] = %felt_const_2105408135 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c20] = %felt_const_4210749205 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c21] = %felt_const_1499050731 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c22] = %felt_const_1195871945 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c23] = %felt_const_4042324747 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c24] = %felt_const_2913812972 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c25] = %felt_const_3570709351 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c26] = %felt_const_2728550397 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c27] = %felt_const_2947499498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c28] = %felt_const_2627478463 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c29] = %felt_const_2762232823 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c30] = %felt_const_1920132246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c31] = %felt_const_3233848155 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c32] = %felt_const_3082253762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c33] = %felt_const_4261273884 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c34] = %felt_const_2475900334 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c35] = %felt_const_640044138 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c36] = %felt_const_909536346 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c37] = %felt_const_1061125697 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c38] = %felt_const_4160222466 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c39] = %felt_const_3435955023 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c40] = %felt_const_875849820 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c41] = %felt_const_2779075060 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c42] = %felt_const_3857043764 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c43] = %felt_const_4059166984 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c44] = %felt_const_1903288979 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c45] = %felt_const_3638078323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c46] = %felt_const_825320019 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c47] = %felt_const_353708607 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c48] = %felt_const_67373068 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c49] = %felt_const_3351745874 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c50] = %felt_const_589514341 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c51] = %felt_const_3284376926 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c52] = %felt_const_404238376 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c53] = %felt_const_2526427041 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c54] = %felt_const_84216335 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c55] = %felt_const_2593796021 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c56] = %felt_const_117902857 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c57] = %felt_const_303178806 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c58] = %felt_const_2155879323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c59] = %felt_const_3806519101 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c60] = %felt_const_3958099238 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c61] = %felt_const_656887401 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c62] = %felt_const_2998042573 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c63] = %felt_const_1970662047 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c64] = %felt_const_151589403 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c65] = %felt_const_2206408094 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c66] = %felt_const_741103732 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c67] = %felt_const_437924910 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c68] = %felt_const_454768173 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c69] = %felt_const_1852759218 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c70] = %felt_const_1515893998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c71] = %felt_const_2694863867 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c72] = %felt_const_1381147894 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c73] = %felt_const_993752653 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c74] = %felt_const_3604395873 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c75] = %felt_const_3014884814 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c76] = %felt_const_690573947 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c77] = %felt_const_3823361342 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c78] = %felt_const_791633521 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c79] = %felt_const_2223248279 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c80] = %felt_const_1397991157 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c81] = %felt_const_3520182632 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c83] = %felt_const_3991781676 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c84] = %felt_const_538984544 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c85] = %felt_const_4244431647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c86] = %felt_const_2981198280 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c87] = %felt_const_1532737261 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c88] = %felt_const_1785386174 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c89] = %felt_const_3419114822 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c90] = %felt_const_3200149465 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c91] = %felt_const_960066123 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c92] = %felt_const_1246401758 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c93] = %felt_const_1280088276 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c94] = %felt_const_1482207464 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c95] = %felt_const_3486483786 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c96] = %felt_const_3503340395 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c97] = %felt_const_4025468202 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c98] = %felt_const_2863288293 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c99] = %felt_const_4227591446 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c100] = %felt_const_1128498885 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c101] = %felt_const_1296931543 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c102] = %felt_const_859006549 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c103] = %felt_const_2240090516 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c104] = %felt_const_1162185423 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c105] = %felt_const_4193904912 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c106] = %felt_const_33686534 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c107] = %felt_const_2139094657 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c108] = %felt_const_1347461360 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c109] = %felt_const_1010595908 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c110] = %felt_const_2678007226 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c111] = %felt_const_2829601763 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c112] = %felt_const_1364304627 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c113] = %felt_const_2745392638 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c114] = %felt_const_1077969088 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c115] = %felt_const_2408514954 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c116] = %felt_const_2459058093 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c117] = %felt_const_2644320700 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c118] = %felt_const_943222856 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c119] = %felt_const_4126535940 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c120] = %felt_const_3166462943 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c121] = %felt_const_3065411521 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c122] = %felt_const_3671764853 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c123] = %felt_const_555827811 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c124] = %felt_const_269492272 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c125] = %felt_const_4294960410 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c126] = %felt_const_4092853518 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c127] = %felt_const_3537026925 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c128] = %felt_const_3452797260 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c129] = %felt_const_202119188 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c130] = %felt_const_320022069 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c131] = %felt_const_3974939439 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c132] = %felt_const_1600110305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c133] = %felt_const_2543269282 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c134] = %felt_const_1145342156 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c135] = %felt_const_387395129 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c136] = %felt_const_3301217111 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c137] = %felt_const_2812761586 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c138] = %felt_const_2122251394 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c139] = %felt_const_1027439175 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c140] = %felt_const_1684326572 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c141] = %felt_const_1566423783 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c142] = %felt_const_421081643 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c143] = %felt_const_1936975509 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c144] = %felt_const_1616953504 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c145] = %felt_const_2172721560 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c146] = %felt_const_1330618065 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c147] = %felt_const_3705447295 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c148] = %felt_const_572671078 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c149] = %felt_const_707417214 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c150] = %felt_const_2425371563 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c151] = %felt_const_2290617219 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c152] = %felt_const_1179028682 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c153] = %felt_const_4008625961 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c154] = %felt_const_3099093971 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c155] = %felt_const_336865340 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c156] = %felt_const_3739133817 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c157] = %felt_const_1583267042 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c158] = %felt_const_185275933 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c159] = %felt_const_3688607094 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c160] = %felt_const_3772832571 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c161] = %felt_const_842163286 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c162] = %felt_const_976909390 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c163] = %felt_const_168432670 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c164] = %felt_const_1229558491 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c165] = %felt_const_101059594 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c166] = %felt_const_606357612 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c167] = %felt_const_1549580516 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c168] = %felt_const_3267534685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c169] = %felt_const_3553869166 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c170] = %felt_const_2896970735 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c171] = %felt_const_1650640038 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c172] = %felt_const_2442213800 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c173] = %felt_const_2509582756 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c174] = %felt_const_3840201527 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c175] = %felt_const_2038035083 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c176] = %felt_const_3890730290 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c177] = %felt_const_3368586051 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c178] = %felt_const_926379609 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c179] = %felt_const_1835915959 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c180] = %felt_const_2374828428 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c181] = %felt_const_3587551588 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c182] = %felt_const_1313774802 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c183] = %felt_const_2846444000 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c184] = %felt_const_1819072692 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c185] = %felt_const_1448520954 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c186] = %felt_const_4109693703 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c187] = %felt_const_3941256997 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c188] = %felt_const_1701169839 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c189] = %felt_const_2054878350 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c190] = %felt_const_2930657257 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c191] = %felt_const_134746136 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c192] = %felt_const_3132780501 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c193] = %felt_const_2021191816 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c194] = %felt_const_623200879 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c195] = %felt_const_774790258 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c196] = %felt_const_471611428 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c197] = %felt_const_2795919345 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c198] = %felt_const_3031724999 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c199] = %felt_const_3334903633 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c200] = %felt_const_3907570467 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c201] = %felt_const_3722289532 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c202] = %felt_const_1953818780 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c203] = %felt_const_522141217 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c204] = %felt_const_1263245021 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c205] = %felt_const_3183305180 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c206] = %felt_const_2341145990 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c207] = %felt_const_2324303749 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c208] = %felt_const_1886445712 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c209] = %felt_const_1044282434 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c210] = %felt_const_3048567236 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c211] = %felt_const_1718013098 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c212] = %felt_const_1212715224 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c213] = %felt_const_50529797 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c214] = %felt_const_4143380225 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c215] = %felt_const_235805714 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c216] = %felt_const_1633796771 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c217] = %felt_const_892693087 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c218] = %felt_const_1465364217 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c219] = %felt_const_3115936208 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c220] = %felt_const_2256934801 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c221] = %felt_const_3250690392 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c222] = %felt_const_488454695 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c223] = %felt_const_2661164985 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c224] = %felt_const_3789674808 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c225] = %felt_const_4177062675 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c226] = %felt_const_2560109491 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c227] = %felt_const_286335539 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c228] = %felt_const_1768542907 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c229] = %felt_const_3654920560 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c230] = %felt_const_2391672713 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c231] = %felt_const_2492740519 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c232] = %felt_const_2610638262 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c233] = %felt_const_505297954 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c234] = %felt_const_2273777042 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c235] = %felt_const_3924412704 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c236] = %felt_const_3469641545 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c237] = %felt_const_1431677695 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c238] = %felt_const_673730680 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c239] = %felt_const_3755976058 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c240] = %felt_const_2357986191 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c241] = %felt_const_2711706104 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c242] = %felt_const_2307459456 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c243] = %felt_const_218962455 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c244] = %felt_const_3216991706 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c245] = %felt_const_3873888049 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c246] = %felt_const_1111655622 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c247] = %felt_const_1751699640 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c248] = %felt_const_1094812355 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c249] = %felt_const_2576951728 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c250] = %felt_const_757946999 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c251] = %felt_const_252648977 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c252] = %felt_const_2964356043 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c253] = %felt_const_1414834428 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c254] = %felt_const_3149622742 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1, %c255] = %felt_const_370551866 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c0] = %felt_const_1673962851 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c1] = %felt_const_2096661628 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c2] = %felt_const_2012125559 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c3] = %felt_const_2079755643 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c4] = %felt_const_4076801522 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c5] = %felt_const_1809235307 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c6] = %felt_const_1876865391 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c7] = %felt_const_3314635973 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c8] = %felt_const_811618352 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c9] = %felt_const_16909057 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c10] = %felt_const_1741597031 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c11] = %felt_const_727088427 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c12] = %felt_const_4276558334 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c13] = %felt_const_3618988759 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c14] = %felt_const_2874009259 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c15] = %felt_const_1995217526 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c16] = %felt_const_3398387146 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c17] = %felt_const_2183110018 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c18] = %felt_const_3381215433 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c19] = %felt_const_2113570685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c20] = %felt_const_4209972730 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c21] = %felt_const_1504897881 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c22] = %felt_const_1200539975 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c23] = %felt_const_4042984432 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c24] = %felt_const_2906778797 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c25] = %felt_const_3568527316 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c26] = %felt_const_2724199842 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c27] = %felt_const_2940594863 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c28] = %felt_const_2619588508 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c29] = %felt_const_2756966308 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c30] = %felt_const_1927583346 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c31] = %felt_const_3231407040 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c32] = %felt_const_3077948087 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c33] = %felt_const_4259388669 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c34] = %felt_const_2470293139 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c35] = %felt_const_642542118 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c36] = %felt_const_913070646 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c37] = %felt_const_1065238847 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c38] = %felt_const_4160029431 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c39] = %felt_const_3431157708 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c40] = %felt_const_879254580 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c41] = %felt_const_2773611685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c42] = %felt_const_3855693029 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c43] = %felt_const_4059629809 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c44] = %felt_const_1910674289 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c45] = %felt_const_3635114968 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c46] = %felt_const_828527409 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c47] = %felt_const_355090197 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c48] = %felt_const_67636228 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c49] = %felt_const_3348452039 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c50] = %felt_const_591815971 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c51] = %felt_const_3281870531 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c52] = %felt_const_405809176 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c53] = %felt_const_2520228246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c54] = %felt_const_84545285 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c55] = %felt_const_2586817946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c56] = %felt_const_118360327 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c57] = %felt_const_304363026 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c58] = %felt_const_2149292928 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c59] = %felt_const_3806281186 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c60] = %felt_const_3956090603 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c61] = %felt_const_659450151 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c62] = %felt_const_2994720178 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c63] = %felt_const_1978310517 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c64] = %felt_const_152181513 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c65] = %felt_const_2199756419 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c66] = %felt_const_743994412 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c67] = %felt_const_439627290 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c68] = %felt_const_456535323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c69] = %felt_const_1859957358 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c70] = %felt_const_1521806938 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c71] = %felt_const_2690382752 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c72] = %felt_const_1386542674 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c73] = %felt_const_997608763 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c74] = %felt_const_3602342358 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c75] = %felt_const_3011366579 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c76] = %felt_const_693271337 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c77] = %felt_const_3822927587 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c78] = %felt_const_794718511 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c79] = %felt_const_2215876484 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c80] = %felt_const_1403450707 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c81] = %felt_const_3518589137 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c83] = %felt_const_3988860141 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c84] = %felt_const_541089824 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c85] = %felt_const_4242743292 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c86] = %felt_const_2977548465 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c87] = %felt_const_1538714971 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c88] = %felt_const_1792327274 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c89] = %felt_const_3415033547 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c90] = %felt_const_3194476990 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c91] = %felt_const_963791673 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c92] = %felt_const_1251270218 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c93] = %felt_const_1285084236 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c94] = %felt_const_1487988824 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c95] = %felt_const_3481619151 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c96] = %felt_const_3501943760 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c97] = %felt_const_4022676207 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c98] = %felt_const_2857362858 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c99] = %felt_const_4226619131 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c100] = %felt_const_1132905795 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c101] = %felt_const_1301993293 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c102] = %felt_const_862344499 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c103] = %felt_const_2232521861 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c104] = %felt_const_1166724933 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c105] = %felt_const_4192801017 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c106] = %felt_const_33818114 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c107] = %felt_const_2147385727 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c108] = %felt_const_1352724560 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c109] = %felt_const_1014514748 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c110] = %felt_const_2670049951 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c111] = %felt_const_2823545768 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c112] = %felt_const_1369633617 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c113] = %felt_const_2740846243 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c114] = %felt_const_1082179648 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c115] = %felt_const_2399505039 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c116] = %felt_const_2453646738 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c117] = %felt_const_2636233885 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c118] = %felt_const_946882616 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c119] = %felt_const_4126213365 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c120] = %felt_const_3160661948 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c121] = %felt_const_3061301686 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c122] = %felt_const_3668932058 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c123] = %felt_const_557998881 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c124] = %felt_const_270544912 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c125] = %felt_const_4293204735 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c126] = %felt_const_4093447923 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c127] = %felt_const_3535760850 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c128] = %felt_const_3447803085 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c129] = %felt_const_202904588 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c130] = %felt_const_321271059 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c131] = %felt_const_3972214764 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c132] = %felt_const_1606345055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c133] = %felt_const_2536874647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c134] = %felt_const_1149815876 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c135] = %felt_const_388905239 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c136] = %felt_const_3297990596 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c137] = %felt_const_2807427751 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c138] = %felt_const_2130477694 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c139] = %felt_const_1031423805 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c140] = %felt_const_1690872932 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c141] = %felt_const_1572530013 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c142] = %felt_const_422718233 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c143] = %felt_const_1944491379 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c144] = %felt_const_1623236704 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c145] = %felt_const_2165938305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c146] = %felt_const_1335808335 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c147] = %felt_const_3701702620 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c148] = %felt_const_574907938 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c149] = %felt_const_710180394 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c150] = %felt_const_2419829648 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c151] = %felt_const_2282455944 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c152] = %felt_const_1183631942 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c153] = %felt_const_4006029806 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c154] = %felt_const_3094074296 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c155] = %felt_const_338181140 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c156] = %felt_const_3735517662 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c157] = %felt_const_1589437022 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c158] = %felt_const_185998603 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c159] = %felt_const_3685578459 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c160] = %felt_const_3772464096 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c161] = %felt_const_845436466 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c162] = %felt_const_980700730 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c163] = %felt_const_169090570 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c164] = %felt_const_1234361161 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c165] = %felt_const_101452294 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c166] = %felt_const_608726052 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c167] = %felt_const_1555620956 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c168] = %felt_const_3265224130 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c169] = %felt_const_3552407251 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c170] = %felt_const_2890133420 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c171] = %felt_const_1657054818 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c172] = %felt_const_2436475025 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c173] = %felt_const_2503058581 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c174] = %felt_const_3839047652 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c175] = %felt_const_2045938553 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c176] = %felt_const_3889509095 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c177] = %felt_const_3364570056 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c178] = %felt_const_929978679 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c179] = %felt_const_1843050349 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c180] = %felt_const_2365688973 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c181] = %felt_const_3585172693 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c182] = %felt_const_1318900302 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c183] = %felt_const_2840191145 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c184] = %felt_const_1826141292 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c185] = %felt_const_1454176854 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c186] = %felt_const_4109567988 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c187] = %felt_const_3939444202 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c188] = %felt_const_1707781989 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c189] = %felt_const_2062847610 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c190] = %felt_const_2923948462 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c191] = %felt_const_135272456 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c192] = %felt_const_3127891386 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c193] = %felt_const_2029029496 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c194] = %felt_const_625635109 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c195] = %felt_const_777810478 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c196] = %felt_const_473441308 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c197] = %felt_const_2790781350 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c198] = %felt_const_3027486644 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c199] = %felt_const_3331805638 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c200] = %felt_const_3905627112 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c201] = %felt_const_3718347997 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c202] = %felt_const_1961401460 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c203] = %felt_const_524165407 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c204] = %felt_const_1268178251 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c205] = %felt_const_3177307325 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c206] = %felt_const_2332919435 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c207] = %felt_const_2316273034 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c208] = %felt_const_1893765232 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c209] = %felt_const_1048330814 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c210] = %felt_const_3044132021 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c211] = %felt_const_1724688998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c212] = %felt_const_1217452104 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c213] = %felt_const_50726147 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c214] = %felt_const_4143383030 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c215] = %felt_const_236720654 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c216] = %felt_const_1640145761 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c217] = %felt_const_896163637 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c218] = %felt_const_1471084887 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c219] = %felt_const_3110719673 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c220] = %felt_const_2249691526 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c221] = %felt_const_3248052417 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c222] = %felt_const_490350365 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c223] = %felt_const_2653403550 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c224] = %felt_const_3789109473 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c225] = %felt_const_4176155640 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c226] = %felt_const_2553000856 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c227] = %felt_const_287453969 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c228] = %felt_const_1775418217 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c229] = %felt_const_3651760345 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c230] = %felt_const_2382858638 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c231] = %felt_const_2486413204 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c232] = %felt_const_2603464347 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c233] = %felt_const_507257374 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c234] = %felt_const_2266337927 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c235] = %felt_const_3922272489 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c236] = %felt_const_3464972750 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c237] = %felt_const_1437269845 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c238] = %felt_const_676362280 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c239] = %felt_const_3752164063 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c240] = %felt_const_2349043596 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c241] = %felt_const_2707028129 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c242] = %felt_const_2299101321 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c243] = %felt_const_219813645 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c244] = %felt_const_3211123391 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c245] = %felt_const_3872862694 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c246] = %felt_const_1115997762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c247] = %felt_const_1758509160 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c248] = %felt_const_1099088705 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c249] = %felt_const_2569646233 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c250] = %felt_const_760903469 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c251] = %felt_const_253628687 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c252] = %felt_const_2960903088 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c253] = %felt_const_1420360788 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c254] = %felt_const_3144537787 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2, %c255] = %felt_const_371997206 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c0] = %felt_const_3332727651 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c1] = %felt_const_4169432188 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c2] = %felt_const_4003034999 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c3] = %felt_const_4136467323 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c4] = %felt_const_4279104242 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c5] = %felt_const_3602738027 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c6] = %felt_const_3736170351 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c7] = %felt_const_2438251973 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c8] = %felt_const_1615867952 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c9] = %felt_const_33751297 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c10] = %felt_const_3467208551 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c11] = %felt_const_1451043627 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c12] = %felt_const_3877240574 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c13] = %felt_const_3043153879 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c14] = %felt_const_1306962859 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c15] = %felt_const_3969545846 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c16] = %felt_const_2403715786 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c17] = %felt_const_530416258 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c18] = %felt_const_2302724553 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c19] = %felt_const_4203183485 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c20] = %felt_const_4011195130 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c21] = %felt_const_3001768281 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c22] = %felt_const_2395555655 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c23] = %felt_const_4211863792 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c24] = %felt_const_1106029997 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c25] = %felt_const_3009926356 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c26] = %felt_const_1610457762 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c27] = %felt_const_1173008303 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c28] = %felt_const_599760028 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c29] = %felt_const_1408738468 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c30] = %felt_const_3835064946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c31] = %felt_const_2606481600 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c32] = %felt_const_1975695287 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c33] = %felt_const_3776773629 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c34] = %felt_const_1034851219 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c35] = %felt_const_1282024998 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c36] = %felt_const_1817851446 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c37] = %felt_const_2118205247 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c38] = %felt_const_4110612471 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c39] = %felt_const_2203045068 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c40] = %felt_const_1750873140 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c41] = %felt_const_1374987685 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c42] = %felt_const_3509904869 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c43] = %felt_const_4178113009 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c44] = %felt_const_3801313649 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c45] = %felt_const_2876496088 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c46] = %felt_const_1649619249 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c47] = %felt_const_708777237 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c48] = %felt_const_135005188 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c49] = %felt_const_2505230279 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c50] = %felt_const_1181033251 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c51] = %felt_const_2640233411 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c52] = %felt_const_807933976 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c53] = %felt_const_933336726 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c54] = %felt_const_168756485 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c55] = %felt_const_800430746 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c56] = %felt_const_235472647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c57] = %felt_const_607523346 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c58] = %felt_const_463175808 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c59] = %felt_const_3745374946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c60] = %felt_const_3441880043 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c61] = %felt_const_1315514151 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c62] = %felt_const_2144187058 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c63] = %felt_const_3936318837 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c64] = %felt_const_303761673 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c65] = %felt_const_496927619 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c66] = %felt_const_1484008492 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c67] = %felt_const_875436570 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c68] = %felt_const_908925723 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c69] = %felt_const_3702681198 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c70] = %felt_const_3035519578 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c71] = %felt_const_1543217312 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c72] = %felt_const_2767606354 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c73] = %felt_const_1984772923 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c74] = %felt_const_3076642518 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c75] = %felt_const_2110698419 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c76] = %felt_const_1383803177 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c77] = %felt_const_3711886307 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c78] = %felt_const_1584475951 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c79] = %felt_const_328696964 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c80] = %felt_const_2801095507 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c81] = %felt_const_3110654417 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c82] = %felt_const_0 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c83] = %felt_const_3240947181 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c84] = %felt_const_1080041504 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c85] = %felt_const_3810524412 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c86] = %felt_const_2043195825 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c87] = %felt_const_3069008731 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c88] = %felt_const_3569248874 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c89] = %felt_const_2370227147 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c90] = %felt_const_1742323390 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c91] = %felt_const_1917532473 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c92] = %felt_const_2497595978 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c93] = %felt_const_2564049996 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c94] = %felt_const_2968016984 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c95] = %felt_const_2236272591 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c96] = %felt_const_3144405200 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c97] = %felt_const_3307925487 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c98] = %felt_const_1340451498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c99] = %felt_const_3977706491 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c100] = %felt_const_2261074755 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c101] = %felt_const_2597801293 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c102] = %felt_const_1716859699 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c103] = %felt_const_294946181 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c104] = %felt_const_2328839493 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c105] = %felt_const_3910203897 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c106] = %felt_const_67502594 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c107] = %felt_const_4269899647 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c108] = %felt_const_2700103760 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c109] = %felt_const_2017737788 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c110] = %felt_const_632987551 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c111] = %felt_const_1273211048 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c112] = %felt_const_2733855057 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c113] = %felt_const_1576969123 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c114] = %felt_const_2160083008 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c115] = %felt_const_92966799 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c116] = %felt_const_1068339858 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c117] = %felt_const_566009245 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c118] = %felt_const_1883781176 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c119] = %felt_const_4043634165 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c120] = %felt_const_1675607228 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c121] = %felt_const_2009183926 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c122] = %felt_const_2943736538 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c123] = %felt_const_1113792801 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c124] = %felt_const_540020752 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c125] = %felt_const_3843751935 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c126] = %felt_const_4245615603 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c127] = %felt_const_3211645650 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c128] = %felt_const_2169294285 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c129] = %felt_const_403966988 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c130] = %felt_const_641012499 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c131] = %felt_const_3274697964 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c132] = %felt_const_3202441055 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c133] = %felt_const_899848087 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c134] = %felt_const_2295088196 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c135] = %felt_const_775493399 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c136] = %felt_const_2472002756 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c137] = %felt_const_1441965991 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c138] = %felt_const_4236410494 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c139] = %felt_const_2051489085 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c140] = %felt_const_3366741092 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c141] = %felt_const_3135724893 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c142] = %felt_const_841685273 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c143] = %felt_const_3868554099 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c144] = %felt_const_3231735904 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c145] = %felt_const_429425025 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c146] = %felt_const_2664517455 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c147] = %felt_const_2743065820 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c148] = %felt_const_1147544098 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c149] = %felt_const_1417554474 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c150] = %felt_const_1001099408 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c151] = %felt_const_193169544 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c152] = %felt_const_2362066502 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c153] = %felt_const_3341414126 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c154] = %felt_const_1809037496 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c155] = %felt_const_675025940 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c156] = %felt_const_2809781982 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c157] = %felt_const_3168951902 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c158] = %felt_const_371002123 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c159] = %felt_const_2910247899 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c160] = %felt_const_3678134496 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c161] = %felt_const_1683370546 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c162] = %felt_const_1951283770 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c163] = %felt_const_337512970 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c164] = %felt_const_2463844681 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c165] = %felt_const_201983494 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c166] = %felt_const_1215046692 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c167] = %felt_const_3101973596 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c168] = %felt_const_2673722050 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c169] = %felt_const_3178157011 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c170] = %felt_const_1139780780 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c171] = %felt_const_3299238498 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c172] = %felt_const_967348625 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c173] = %felt_const_832869781 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c174] = %felt_const_3543655652 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c175] = %felt_const_4069226873 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c176] = %felt_const_3576883175 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c177] = %felt_const_2336475336 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c178] = %felt_const_1851340599 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c179] = %felt_const_3669454189 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c180] = %felt_const_25988493 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c181] = %felt_const_2976175573 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c182] = %felt_const_2631028302 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c183] = %felt_const_1239460265 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c184] = %felt_const_3635702892 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c185] = %felt_const_2902087254 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c186] = %felt_const_4077384948 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c187] = %felt_const_3475368682 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c188] = %felt_const_3400492389 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c189] = %felt_const_4102978170 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c190] = %felt_const_1206496942 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c191] = %felt_const_270010376 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c192] = %felt_const_1876277946 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c193] = %felt_const_4035475576 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c194] = %felt_const_1248797989 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c195] = %felt_const_1550986798 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c196] = %felt_const_941890588 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c197] = %felt_const_1475454630 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c198] = %felt_const_1942467764 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c199] = %felt_const_2538718918 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c200] = %felt_const_3408128232 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c201] = %felt_const_2709315037 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c202] = %felt_const_3902567540 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c203] = %felt_const_1042358047 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c204] = %felt_const_2531085131 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c205] = %felt_const_1641856445 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c206] = %felt_const_226921355 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c207] = %felt_const_260409994 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c208] = %felt_const_3767562352 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c209] = %felt_const_2084716094 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c210] = %felt_const_1908716981 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c211] = %felt_const_3433719398 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c212] = %felt_const_2430093384 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c213] = %felt_const_100991747 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c214] = %felt_const_4144101110 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c215] = %felt_const_470945294 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c216] = %felt_const_3265487201 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c217] = %felt_const_1784624437 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c218] = %felt_const_2935576407 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c219] = %felt_const_1775286713 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c220] = %felt_const_395413126 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c221] = %felt_const_2572730817 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c222] = %felt_const_975641885 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c223] = %felt_const_666476190 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c224] = %felt_const_3644383713 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c225] = %felt_const_3943954680 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c226] = %felt_const_733190296 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c227] = %felt_const_573772049 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c228] = %felt_const_3535497577 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c229] = %felt_const_2842745305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c230] = %felt_const_126455438 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c231] = %felt_const_866620564 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c232] = %felt_const_766942107 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c233] = %felt_const_1008868894 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c234] = %felt_const_361924487 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c235] = %felt_const_3374377449 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c236] = %felt_const_2269761230 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c237] = %felt_const_2868860245 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c238] = %felt_const_1350051880 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c239] = %felt_const_2776293343 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c240] = %felt_const_59739276 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c241] = %felt_const_1509466529 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c242] = %felt_const_159418761 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c243] = %felt_const_437718285 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c244] = %felt_const_1708834751 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c245] = %felt_const_3610371814 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c246] = %felt_const_2227585602 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c247] = %felt_const_3501746280 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c248] = %felt_const_2193834305 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c249] = %felt_const_699439513 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c250] = %felt_const_1517759789 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c251] = %felt_const_504434447 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c252] = %felt_const_2076946608 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c253] = %felt_const_2835108948 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c254] = %felt_const_1842789307 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3, %c255] = %felt_const_742004246 : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg0 : !felt.type<"babybear"> + %1 = cast.toindex %arg1 : !felt.type<"babybear"> + %2 = array.read %nondet[%0, %1] : <4,256 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %2 : !felt.type<"babybear"> + } + poly.template @XOR_0 { + struct.def @XOR_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_0::@XOR_0<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_0::@XOR_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_0::@XOR_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Bits2Num_1 { + struct.def @Bits2Num_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %arg2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %0#0 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @EmulatedAesencRowShifting_3 { + struct.def @EmulatedAesencRowShifting_3 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_15 = felt.const 15 : <"babybear"> {product_source = "compute"} + %felt_const_14 = felt.const 14 : <"babybear"> {product_source = "compute"} + %felt_const_13 = felt.const 13 : <"babybear"> {product_source = "compute"} + %felt_const_12 = felt.const 12 : <"babybear"> {product_source = "compute"} + %felt_const_11 = felt.const 11 : <"babybear"> {product_source = "compute"} + %felt_const_10 = felt.const 10 : <"babybear"> {product_source = "compute"} + %felt_const_9 = felt.const 9 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_6 = felt.const 6 : <"babybear"> {product_source = "compute"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_10 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_15 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_11 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_10 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_15 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_2 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_11 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c16 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %nondet_0[%2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %nondet_1[%8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%10] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + } + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_15 = felt.const 15 : <"babybear"> {product_source = "compute"} + %felt_const_14 = felt.const 14 : <"babybear"> {product_source = "compute"} + %felt_const_13 = felt.const 13 : <"babybear"> {product_source = "compute"} + %felt_const_12 = felt.const 12 : <"babybear"> {product_source = "compute"} + %felt_const_11 = felt.const 11 : <"babybear"> {product_source = "compute"} + %felt_const_10 = felt.const 10 : <"babybear"> {product_source = "compute"} + %felt_const_9 = felt.const 9 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_6 = felt.const 6 : <"babybear"> {product_source = "compute"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_10 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_15 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_11 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c16 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_0[%1] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_15 = felt.const 15 : <"babybear"> {product_source = "constrain"} + %felt_const_14 = felt.const 14 : <"babybear"> {product_source = "constrain"} + %felt_const_13 = felt.const 13 : <"babybear"> {product_source = "constrain"} + %felt_const_12 = felt.const 12 : <"babybear"> {product_source = "constrain"} + %felt_const_11 = felt.const 11 : <"babybear"> {product_source = "constrain"} + %felt_const_10 = felt.const 10 : <"babybear"> {product_source = "constrain"} + %felt_const_9 = felt.const 9 : <"babybear"> {product_source = "constrain"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "constrain"} + %felt_const_6 = felt.const 6 : <"babybear"> {product_source = "constrain"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "constrain"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_5 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_10 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_15 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_4 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_2 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_11 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %nondet[%2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @EmulatedAesencSubstituteBytes_4 { + struct.def @EmulatedAesencSubstituteBytes_4 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c16 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = function.call @emulated_aesenc_rijndael_sbox_0(%2) : (!felt.type<"babybear">) -> !felt.type<"babybear"> + %4 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> + function.return %self : !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> + function.return + } + } + } + poly.template @Num2Bits_5 { + struct.def @Num2Bits_5 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AES256Encrypt_6 { + struct.def @AES256Encrypt_6 { + struct.member @out : !array.type<128 x !felt.type<"babybear">> {llzk.pub} + struct.member @num2bits_1 : !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @num2bits_1$inputs : !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @xor_2 : !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_2$inputs : !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @num2bits_2 : !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> + struct.member @num2bits_2$inputs : !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @xor_4 : !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_4$inputs : !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @row_shifting : !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + struct.member @row_shifting$inputs : !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + struct.member @bits2num_1 : !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + struct.member @bits2num_1$inputs : !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + struct.member @bits2num_2 : !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> + struct.member @bits2num_2$inputs : !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + struct.member @sub_bytes : !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> + struct.member @sub_bytes$inputs : !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + struct.member @xor_1 : !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_1$inputs : !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @xor_3 : !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_3$inputs : !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<128 x !felt.type<"babybear">>, %arg1: !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %felt_const_56 = felt.const 56 : <"babybear"> {product_source = "compute"} + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c8 = arith.constant {product_source = "compute"} 8 : index + %c16 = arith.constant {product_source = "compute"} 16 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c13 = arith.constant {product_source = "compute"} 13 : index + %self = struct.new : <@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %31 = array.read %array[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3, %arg4] = %31 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %31 = array.read %array_1[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg2, %arg3, %arg4, %arg5] = %31 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = array.read %array_3[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg2] = %31 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <16 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %31 = array.read %array_5[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg2, %arg3] = %31 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_7 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_8 = array.new : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %31 = array.read %array_8[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_8[%arg2, %arg3, %arg4] = %31 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_9 = array.new : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_10 = array.new : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = array.read %array_10[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_10[%arg2] = %31 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_11 = array.new : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %pod_12 = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_13 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_14 = array.new : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %31 = array.read %array_14[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_14[%arg2, %arg3] = %31 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_15 = array.new : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_16 = array.new : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %31 = array.read %array_16[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %31[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_16[%arg2, %arg3, %arg4] = %31 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_17 = array.new : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_18 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_19 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_19[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_18[%c0] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_18[%c1] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_18[%c2] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_18[%c3] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_20 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_21 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_21[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_20[%c0] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_20[%c1] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_20[%c2] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_20[%c3] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %32 to %33 step %34 { + %35 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %36 = bool.cmp lt(%35, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %31, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %arg0[%39] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_15[%41, %42] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %43[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_15[%44, %45] = %43 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %46 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_14[%46, %47] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %43[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = pod.read %43[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = function.call @XOR_0::@XOR_0::@compute(%76, %77) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %48[@comp] = %78 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %79 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_14[%79, %80] = %48 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %31, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.mul %52, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.add %53, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %arg1[%55] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %array_15[%57, %58] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %59[@b] = %56 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_15[%60, %61] = %59 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %62 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %array_14[%62, %63] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %64[@count] = %66 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %59[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = pod.read %59[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = function.call @XOR_0::@XOR_0::@compute(%76, %77) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %64[@comp] = %78 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %79 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_14[%79, %80] = %64 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %68 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_14[%68, %69] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %71 = pod.read %70[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %72 = struct.readm %71[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%73, %74] = %72 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + %0:5 = scf.for %arg2 = %c0 to %c13 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0, %arg6 = %felt_const_4, %arg7 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32:4 = scf.for %arg8 = %c0 to %c4 step %c1 iter_args(%arg9 = %arg7, %arg10 = %arg4, %arg11 = %arg5, %arg12 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %38 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %39:4 = scf.while (%arg13 = %felt_const_0, %arg14 = %arg11, %arg15 = %arg12, %arg16 = %arg10) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %40 = bool.cmp lt(%arg13, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%40) %arg13, %arg14, %arg15, %arg16 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg13: !felt.type<"babybear">, %arg14: !felt.type<"babybear">, %arg15: !felt.type<"babybear">, %arg16: !felt.type<"babybear">): + %nondet_36 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_36[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_36[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %arg13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.umod %40, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.extract %nondet_18[%42] : <4,32 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg17 = %c0 to %c8 step %c1 { + %68 = cast.tofelt %arg17 : index, !felt.type<"babybear"> {product_source = "compute"} + %69 = felt.mul %arg13, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %70 = felt.add %69, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.sub %70, %68 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %43[%72] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %array_9[%74, %75, %76] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %78 = pod.read %77[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79] = %73 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %array_9[%80, %81, %82] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %83[@in] = %78 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %84 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_9[%84, %85, %86] = %83 : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %87 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %array_8[%87, %88, %89] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %91 = pod.read %90[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.subi %91, %c1 {product_source = "compute"} : index + pod.write %90[@count] = %92 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.cmpi eq, %92, %c0 {product_source = "compute"} : index + scf.if %93 { + %94 = pod.read %83[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %95 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%94) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %90[@comp] = %95 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %96 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%96, %97, %98] = %90 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_8[%44, %45, %46] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %48 = pod.read %47[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %49 = struct.readm %48[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %50 = function.call @emulated_aesenc_enc_table_1(%arg13, %49) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %array_0[%51, %52, %53] : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %54[@in] = %50 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%55, %56, %57] = %54 : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %58 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array[%58, %59, %60] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %68 = pod.read %54[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = function.call @Num2Bits_2::@Num2Bits_2::@product(%68) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %70 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%68) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %61[@comp] = %69 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %71 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%71, %72, %73] = %61 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %65 = bool.cmp eq(%arg13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66:2 = scf.if %65 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %68:2 = scf.while (%arg17 = %arg15, %arg18 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %69 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%69) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %69 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %71 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%71) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %71 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array[%71, %72, %c0] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %75 = struct.readm %74[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %76 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %76, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = felt.sub %77, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %75[%79] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %83 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.add %83, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_2[%81, %82, %c0, %85] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %86[@a] = %80 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %89 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %89, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%87, %88, %c0, %91] = %86 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %92 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %95 = felt.add %94, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %95 : !felt.type<"babybear"> {product_source = "compute"} + %97 = array.read %array_1[%92, %93, %c0, %96] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %98 = pod.read %97[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %99 = arith.subi %98, %c1 {product_source = "compute"} : index + pod.write %97[@count] = %99 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %100 = arith.cmpi eq, %99, %c0 {product_source = "compute"} : index + scf.if %100 { + %102 = pod.read %86[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %103 = pod.read %86[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %104 = function.call @XOR_0::@XOR_0::@compute(%102, %103) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %97[@comp] = %104 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %105 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %107 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %108 = felt.add %107, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %109 = cast.toindex %108 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%105, %106, %c0, %109] = %97 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %101 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %101 : !felt.type<"babybear"> + } + %70 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %69, %70 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %68#1, %68#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %68 = bool.cmp lt(%arg13, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69:2 = scf.if %68 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %70:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %71 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%71) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %71 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %73 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%73) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %73 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array[%73, %74, %75] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %77 = pod.read %76[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %78 = struct.readm %77[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %79 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = felt.add %79, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.sub %80, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %78[%82] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %86 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %86 : !felt.type<"babybear"> {product_source = "compute"} + %88 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = felt.add %88, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %89 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %array_2[%84, %85, %87, %90] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %91[@b] = %83 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %94 : !felt.type<"babybear"> {product_source = "compute"} + %96 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %97 = felt.add %96, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%92, %93, %95, %98] = %91 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %99 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + %103 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = felt.add %103, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %105 = cast.toindex %104 : !felt.type<"babybear"> {product_source = "compute"} + %106 = array.read %array_1[%99, %100, %102, %105] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %107 = pod.read %106[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.subi %107, %c1 {product_source = "compute"} : index + pod.write %106[@count] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %109 = arith.cmpi eq, %108, %c0 {product_source = "compute"} : index + scf.if %109 { + %144 = pod.read %91[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %145 = pod.read %91[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %146 = function.call @XOR_0::@XOR_0::@compute(%144, %145) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %106[@comp] = %146 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %147 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %148 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %149 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %150 = cast.toindex %149 : !felt.type<"babybear"> {product_source = "compute"} + %151 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%147, %148, %150, %153] = %106 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %110 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %111 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %112 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %113 = cast.toindex %112 : !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = felt.add %114, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %116 = cast.toindex %115 : !felt.type<"babybear"> {product_source = "compute"} + %117 = array.read %array_1[%110, %111, %113, %116] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %118 = pod.read %117[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %119 = struct.readm %118[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %120 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %121 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %123 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %124 = felt.add %123, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %125 = cast.toindex %124 : !felt.type<"babybear"> {product_source = "compute"} + %126 = array.read %array_2[%120, %121, %122, %125] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %126[@a] = %119 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %127 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %129 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %130 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %131 = felt.add %130, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %132 = cast.toindex %131 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%127, %128, %129, %132] = %126 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %133 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %134 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %135 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %136 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %137 = felt.add %136, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %138 = cast.toindex %137 : !felt.type<"babybear"> {product_source = "compute"} + %139 = array.read %array_1[%133, %134, %135, %138] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %140 = pod.read %139[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %141 = arith.subi %140, %c1 {product_source = "compute"} : index + pod.write %139[@count] = %141 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %142 = arith.cmpi eq, %141, %c0 {product_source = "compute"} : index + scf.if %142 { + %144 = pod.read %126[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %145 = pod.read %126[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %146 = function.call @XOR_0::@XOR_0::@compute(%144, %145) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %139[@comp] = %146 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %147 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %148 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %149 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %150 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %151 = felt.add %150, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%147, %148, %149, %152] = %139 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %143 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %143 : !felt.type<"babybear"> + } + %72 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %72, %71 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %70#0, %70#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %70:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %71 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%71) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %71 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %73 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%73) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %73 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %array[%73, %74, %c3] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %76 = pod.read %75[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %77 = struct.readm %76[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %78 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %79 = felt.add %78, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = felt.sub %79, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %77[%81] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %85 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = felt.add %85, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %86 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %array_2[%83, %84, %c2, %87] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %88[@b] = %82 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %91 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %92 = felt.add %91, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%89, %90, %c2, %93] = %88 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %94 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %96 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %97 = felt.add %96, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %array_1[%94, %95, %c2, %98] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %100 = pod.read %99[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %101 = arith.subi %100, %c1 {product_source = "compute"} : index + pod.write %99[@count] = %101 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %102 = arith.cmpi eq, %101, %c0 {product_source = "compute"} : index + scf.if %102 { + %132 = pod.read %88[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %88[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %134 = function.call @XOR_0::@XOR_0::@compute(%132, %133) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %99[@comp] = %134 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %135 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %136 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %137 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %138 = felt.add %137, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%135, %136, %c2, %139] = %99 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %103 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %105 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = felt.add %105, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %107 = cast.toindex %106 : !felt.type<"babybear"> {product_source = "compute"} + %108 = array.read %array_1[%103, %104, %c2, %107] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %109 = pod.read %108[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %110 = struct.readm %109[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %111 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %113 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %113, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + %116 = array.read %array_17[%111, %112, %115] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %116[@a] = %110 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %118 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %119 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %120 = felt.add %119, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %121 = cast.toindex %120 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_17[%117, %118, %121] = %116 : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %122 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %124 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %125 = felt.add %124, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %125 : !felt.type<"babybear"> {product_source = "compute"} + %127 = array.read %array_16[%122, %123, %126] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %128 = pod.read %127[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %129 = arith.subi %128, %c1 {product_source = "compute"} : index + pod.write %127[@count] = %129 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %130 = arith.cmpi eq, %129, %c0 {product_source = "compute"} : index + scf.if %130 { + %132 = pod.read %116[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %116[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %134 = function.call @XOR_0::@XOR_0::@compute(%132, %133) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %127[@comp] = %134 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %135 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %136 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %137 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %138 = felt.add %137, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_16[%135, %136, %139] = %127 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %131 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %131 : !felt.type<"babybear"> + } + %72 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %72, %71 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %70#0, %70#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %69#0, %69#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %67 = felt.add %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %67, %50, %66#1, %66#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %39#0, %39#3, %39#1, %39#2 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %33 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %35 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %36 = scf.for %arg8 = %33 to %34 step %35 iter_args(%arg9 = %32#1) -> (!felt.type<"babybear">) { + %38 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %39 = bool.cmp lt(%38, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %42 = bool.cmp lt(%arg10, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%42) %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %42 = felt.add %38, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.add %43, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg1[%45] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_17[%47, %48, %49] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %50[@b] = %46 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_17[%51, %52, %53] = %50 : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %54 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_16[%54, %55, %56] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %58 = pod.read %57[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.subi %58, %c1 {product_source = "compute"} : index + pod.write %57[@count] = %59 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %60 = arith.cmpi eq, %59, %c0 {product_source = "compute"} : index + scf.if %60 { + %70 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = function.call @XOR_0::@XOR_0::@compute(%70, %71) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %57[@comp] = %72 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %73 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_16[%73, %74, %75] = %57 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %61 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %array_16[%61, %62, %63] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %66 = struct.readm %65[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%67, %68] = %66 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %69 : !felt.type<"babybear"> + } + %41 = felt.add %38, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %40 : !felt.type<"babybear"> + } + %37 = felt.add %arg6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %32#3, %36, %32#2, %37, %32#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %nondet_22 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_22[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %0#4) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %35 = scf.for %arg4 = %32 to %33 step %34 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %36 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %37 = bool.cmp lt(%36, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %49 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%49) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %49 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.mul %36, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %51, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %nondet_18[%49, %53] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.add %55, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %array_11[%57] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %59 = pod.read %58[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %59[%60] = %54 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %61, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %array_11[%63] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %64[@in] = %59 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %65 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66 = felt.add %65, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_11[%67] = %64 : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %68 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = felt.add %68, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_10[%70] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %72 = pod.read %71[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %71[@count] = %73 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %76 = pod.read %64[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %77 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%76) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %71[@comp] = %77 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %78 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %79 = felt.add %78, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_10[%80] = %71 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %75 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %75 : !felt.type<"babybear"> + } + %39 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_10[%41] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %45, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%47] = %44 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %36, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %38 : !felt.type<"babybear"> + } + scf.yield %35 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %nondet_22[%32] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_7[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35] = %33 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@in] = %34 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %37 : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %pod_7[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %40 = function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@product(%39) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> + %41 = function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@compute(%39) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %40 : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + %33 = struct.readm %32[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %33[%34] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_13[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_13[@in] = %36 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_12[@count] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_12[@count] = %39 : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_13[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4::@compute(%41) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + pod.write %pod_12[@comp] = %42 : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %1) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %35 = scf.for %arg4 = %32 to %33 step %34 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %36 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %37 = bool.cmp lt(%36, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %40 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %39[%42] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %44, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_4[%46] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %47[@in] = %43 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %48, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%50] = %47 : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.add %51, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %array_3[%53] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %55 = pod.read %54[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.subi %55, %c1 {product_source = "compute"} : index + pod.write %54[@count] = %56 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.cmpi eq, %56, %c0 {product_source = "compute"} : index + scf.if %57 { + %60 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %61 = function.call @Num2Bits_5::@Num2Bits_5::@product(%60) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %62 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%60) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + pod.write %54[@comp] = %61 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %63 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %64 = felt.add %63, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%65] = %54 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %58 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %60 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%60) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %60 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = felt.add %60, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_3[%62] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %64 = pod.read %63[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %65 = struct.readm %64[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = felt.sub %felt_const_7, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %65[%67] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %70 = felt.mul %36, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %70, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%69, %72] = %68 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %73 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %73 : !felt.type<"babybear"> + } + %59 = felt.add %36, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %58 : !felt.type<"babybear"> + } + scf.yield %35 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %32 to %33 step %34 { + %35 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %36 = bool.cmp lt(%35, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet_18[%37, %38] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_6[%40, %41] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %42[@a] = %39 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%43, %44] = %42 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %45 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_5[%45, %46] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %48 = pod.read %47[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %47[@count] = %49 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %75 = pod.read %42[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %76 = pod.read %42[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = function.call @XOR_0::@XOR_0::@compute(%75, %76) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %47[@comp] = %77 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %78 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%78, %79] = %47 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %51 = felt.add %31, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.mul %51, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %arg1[%54] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %array_6[%56, %57] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %58[@b] = %55 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%59, %60] = %58 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %61 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_5[%61, %62] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %64 = pod.read %63[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %63[@count] = %65 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %75 = pod.read %58[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %76 = pod.read %58[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = function.call @XOR_0::@XOR_0::@compute(%75, %76) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %63[@comp] = %77 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %78 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%78, %79] = %63 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %67 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %array_5[%67, %68] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %70 = pod.read %69[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %71 = struct.readm %70[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%72, %73] = %71 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %32 to %33 step %34 { + %35 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %36 = bool.cmp lt(%35, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet_18[%37, %38] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.mul %31, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %39 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@xor_3$inputs] = %array_17 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_23 = array.new : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %31 = array.read %array_16[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_23[%arg2, %arg3, %arg4] = %32 : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_3] = %array_23 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_1$inputs] = %array_0 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_24 = array.new : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %31 = array.read %array[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_24[%arg2, %arg3, %arg4] = %32 : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@num2bits_1] = %array_24 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@row_shifting$inputs] = %pod_7 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + struct.writem %self[@row_shifting] = %3 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + struct.writem %self[@bits2num_2$inputs] = %array_11 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_25 = array.new : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = array.read %array_10[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + array.write %array_25[%arg2] = %32 : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@bits2num_2] = %array_25 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + struct.writem %self[@bits2num_1$inputs] = %array_9 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_26 = array.new : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %31 = array.read %array_8[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + array.write %array_26[%arg2, %arg3, %arg4] = %32 : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@bits2num_1] = %array_26 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_2$inputs] = %array_4 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_27 = array.new : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = array.read %array_3[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + array.write %array_27[%arg2] = %32 : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@num2bits_2] = %array_27 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + struct.writem %self[@xor_4$inputs] = %array_6 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_28 = array.new : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %31 = array.read %array_5[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_28[%arg2, %arg3] = %32 : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_4] = %array_28 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@sub_bytes$inputs] = %pod_13 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + struct.writem %self[@sub_bytes] = %4 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_15 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_29 = array.new : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %31 = array.read %array_14[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_29[%arg2, %arg3] = %32 : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_29 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@xor_2$inputs] = %array_2 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_30 = array.new : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %31 = array.read %array_1[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_30[%arg2, %arg3, %arg4, %arg5] = %32 : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_2] = %array_30 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = struct.readm %self[@num2bits_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %7 = struct.readm %self[@num2bits_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %8 = struct.readm %self[@xor_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %9 = struct.readm %self[@xor_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %10 = struct.readm %self[@num2bits_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %12 = struct.readm %self[@xor_4] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %13 = struct.readm %self[@xor_4$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %14 = struct.readm %self[@row_shifting] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@row_shifting$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = struct.readm %self[@bits2num_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "constrain"} + %17 = struct.readm %self[@bits2num_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %18 = struct.readm %self[@bits2num_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "constrain"} + %19 = struct.readm %self[@bits2num_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %20 = struct.readm %self[@sub_bytes] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "constrain"} + %21 = struct.readm %self[@sub_bytes$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = struct.readm %self[@xor_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %23 = struct.readm %self[@xor_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %24 = struct.readm %self[@xor_3] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %25 = struct.readm %self[@xor_3$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet_31 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_32 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_32[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_32[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_31[%c0] = %nondet_32 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_31[%c1] = %nondet_32 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_31[%c2] = %nondet_32 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_31[%c3] = %nondet_32 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_33 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_34 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_34[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_34[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_33[%c0] = %nondet_34 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_33[%c1] = %nondet_34 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_33[%c2] = %nondet_34 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_33[%c3] = %nondet_34 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %32 to %33 step %34 { + %35 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %36 = bool.cmp lt(%35, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %31, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg0[%39] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %23[%41, %42] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %31, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %46, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg1[%48] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %23[%50, %51] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %22[%54, %55] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %57 = struct.readm %56[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_31[%58, %59] = %57 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + %26:5 = scf.for %arg2 = %c0 to %c13 step %c1 iter_args(%arg3 = %felt_const_4, %arg4 = %felt_const_0, %arg5 = %felt_const_0, %arg6 = %felt_const_0, %arg7 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32:4 = scf.for %arg8 = %c0 to %c4 step %c1 iter_args(%arg9 = %arg5, %arg10 = %arg4, %arg11 = %arg6, %arg12 = %arg7) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %38 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %39:4 = scf.while (%arg13 = %arg11, %arg14 = %arg9, %arg15 = %felt_const_0, %arg16 = %arg12) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %40 = bool.cmp lt(%arg15, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%40) {product_source = "constrain"} %arg13, %arg14, %arg15, %arg16 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg13: !felt.type<"babybear">, %arg14: !felt.type<"babybear">, %arg15: !felt.type<"babybear">, %arg16: !felt.type<"babybear">): + %nondet_36 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_36[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_36[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %arg15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.umod %40, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.extract %nondet_31[%42] : <4,32 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg17 = %c0 to %c8 step %c1 { + %53 = cast.tofelt %arg17 : index, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.mul %arg15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %54, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.sub %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %43[%57] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %arg15 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %17[%59, %60, %61] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %63 = pod.read %62[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %63[%64] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %arg15 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %16[%44, %45, %46] : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %48 = struct.readm %47[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = function.call @emulated_aesenc_enc_table_1(%arg15, %48) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + %50 = bool.cmp eq(%arg15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51:2 = scf.if %50 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %53:2 = scf.while (%arg17 = %arg14, %arg18 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %54 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%54) {product_source = "constrain"} %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %54 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %56 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%56) {product_source = "constrain"} %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %56 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %6[%56, %57, %c0] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %59 = struct.readm %58[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %60 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = felt.add %60, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.sub %61, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %59[%63] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %67, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %9[%65, %66, %c0, %69] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %71 = pod.read %70[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %72 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %55 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %54, %55 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %53#0, %53#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %53 = bool.cmp lt(%arg15, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54:2 = scf.if %53 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %55:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg14) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %56 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%56) {product_source = "constrain"} %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %56 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %58 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%58) {product_source = "constrain"} %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %58 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %arg15 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %6[%58, %59, %60] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %62 = struct.readm %61[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.add %63, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = felt.sub %64, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %62[%66] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = felt.sub %arg15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %73 = felt.add %72, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %9[%68, %69, %71, %74] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %76 = pod.read %75[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %76, %67 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %77 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %78 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = felt.sub %arg15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %82 = felt.add %81, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %83 = cast.toindex %82 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %8[%77, %78, %80, %83] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %85 = struct.readm %84[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %86 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %87 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %88 = cast.toindex %arg15 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %90 = felt.add %89, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "constrain"} + %92 = array.read %9[%86, %87, %88, %91] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %93 = pod.read %92[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %93, %85 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %94 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %94 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %57 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %57, %56 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %55#1, %55#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %55:2 = scf.while (%arg17 = %arg14, %arg18 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %56 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%56) {product_source = "constrain"} %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %56 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %58 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%58) {product_source = "constrain"} %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %58 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %6[%58, %59, %c3] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %61 = struct.readm %60[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = felt.add %62, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.sub %63, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %61[%65] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = felt.add %69, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = array.read %9[%67, %68, %c2, %71] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %73 = pod.read %72[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %73, %66 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %77 = felt.add %76, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %8[%74, %75, %c2, %78] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %80 = struct.readm %79[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %84 = felt.add %83, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "constrain"} + %86 = array.read %25[%81, %82, %85] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %87 = pod.read %86[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %87, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %88 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %88 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %57 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %56, %57 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %55#0, %55#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %54#0, %54#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %52 = felt.add %arg15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %51#1, %51#0, %52, %49 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %39#1, %39#2, %39#0, %39#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %33 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %35 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %36 = scf.for %arg8 = %33 to %34 step %35 iter_args(%arg9 = %32#2) -> (!felt.type<"babybear">) { + %38 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %39 = bool.cmp lt(%38, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %42 = bool.cmp lt(%arg10, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%42) %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %42 = felt.add %38, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.add %43, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg1[%45] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %25[%47, %48, %49] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %24[%52, %53, %54] : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %56 = struct.readm %55[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_31[%57, %58] = %56 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %59 : !felt.type<"babybear"> + } + %41 = felt.add %38, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %40 : !felt.type<"babybear"> + } + %37 = felt.add %arg3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %37, %32#1, %32#0, %36, %32#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %nondet_35 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_35[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %26#1) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %35 = scf.for %arg4 = %32 to %33 step %34 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %36 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %37 = bool.cmp lt(%36, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %48 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%48) {product_source = "constrain"} %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %48 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %36, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.sub %50, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %nondet_31[%48, %52] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %54, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %19[%56] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %61 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %39 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %18[%41] : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %43 = struct.readm %42[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_35[%46] = %43 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %36, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %38 : !felt.type<"babybear"> + } + scf.yield %35 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %nondet_35[%32] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %15[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %34[%35] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = struct.readm %14[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = pod.read %21[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %28 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %27) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %35 = scf.for %arg4 = %32 to %33 step %34 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %36 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %37 = bool.cmp lt(%36, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = struct.readm %20[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %38[%41] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.add %43, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %11[%45] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %47 = pod.read %46[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %50 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%50) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %50 = felt.mul %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %10[%52] : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %54 = struct.readm %53[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = felt.sub %felt_const_7, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %54[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = felt.mul %36, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %59, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_31[%58, %61] = %57 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %62 : !felt.type<"babybear"> + } + %49 = felt.add %36, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %48 : !felt.type<"babybear"> + } + scf.yield %35 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %32 to %33 step %34 { + %35 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %36 = bool.cmp lt(%35, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %nondet_31[%37, %38] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %13[%40, %41] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %43 = pod.read %42[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.add %31, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %44, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %arg1[%47] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %13[%49, %50] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %52 = pod.read %51[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %12[%53, %54] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %56 = struct.readm %55[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_31[%57, %58] = %56 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %31 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %33 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %34 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %32 to %33 step %34 { + %35 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %36 = bool.cmp lt(%35, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %nondet_31[%37, %38] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %31, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %40, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %5[%42] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %31 = array.read %24[%arg2, %arg3, %arg4] : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %32 = array.read %25[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%31, %33, %34) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %31 = array.read %6[%arg2, %arg3, %arg4] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %32 = array.read %7[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%31, %33) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %29 = pod.read %15[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@constrain(%14, %29) : (!struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = array.read %18[%arg2] : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %32 = array.read %19[%arg2] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%31, %33) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %31 = array.read %16[%arg2, %arg3, %arg4] : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %32 = array.read %17[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%31, %33) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %31 = array.read %10[%arg2] : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %32 = array.read %11[%arg2] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%31, %33) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %31 = array.read %12[%arg2, %arg3] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %32 = array.read %13[%arg2, %arg3] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%31, %33, %34) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %30 = pod.read %21[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4::@constrain(%20, %30) : (!struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %31 = array.read %22[%arg2, %arg3] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %32 = array.read %23[%arg2, %arg3] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%31, %33, %34) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %31 = array.read %8[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %32 = array.read %9[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%31, %33, %34) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> + } + function.def @compute(%arg0: !array.type<128 x !felt.type<"babybear">>, %arg1: !array.type<1920 x !felt.type<"babybear">>) -> !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %felt_const_56 = felt.const 56 : <"babybear"> {product_source = "compute"} + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c8 = arith.constant {product_source = "compute"} 8 : index + %c16 = arith.constant {product_source = "compute"} 16 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c13 = arith.constant {product_source = "compute"} 13 : index + %self = struct.new : <@AES256Encrypt_6::@AES256Encrypt_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3, %arg4] = %5 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %5 = array.read %array_1[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg2, %arg3, %arg4, %arg5] = %5 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_3[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg2] = %5 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <16 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_5[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg2, %arg3] = %5 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_7 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_8 = array.new : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array_8[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_8[%arg2, %arg3, %arg4] = %5 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_9 = array.new : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_10 = array.new : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_10[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_10[%arg2] = %5 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_11 = array.new : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %pod_12 = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_13 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_14 = array.new : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_14[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_14[%arg2, %arg3] = %5 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_15 = array.new : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_16 = array.new : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %5 = array.read %array_16[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_16[%arg2, %arg3, %arg4] = %5 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_17 = array.new : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_18 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_19 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_19[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_19[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_18[%c0] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_18[%c1] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_18[%c2] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_18[%c3] = %nondet_19 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_20 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_21 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_21[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_20[%c0] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_20[%c1] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_20[%c2] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_20[%c3] = %nondet_21 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %5, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%13] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_15[%15, %16] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@a] = %14 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_15[%18, %19] = %17 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %20 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_14[%20, %21] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %50 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %52 = function.call @XOR_0::@XOR_0::@compute(%50, %51) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %22[@comp] = %52 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %53 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_14[%53, %54] = %22 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %26 = felt.add %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.mul %26, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %27, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg1[%29] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_15[%31, %32] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %33[@b] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_15[%34, %35] = %33 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %36 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_14[%36, %37] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %52 = function.call @XOR_0::@XOR_0::@compute(%50, %51) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %38[@comp] = %52 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %53 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_14[%53, %54] = %38 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_14[%42, %43] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%47, %48] = %46 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + %0:5 = scf.for %arg2 = %c0 to %c13 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0, %arg6 = %felt_const_4, %arg7 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6:4 = scf.for %arg8 = %c0 to %c4 step %c1 iter_args(%arg9 = %arg7, %arg10 = %arg4, %arg11 = %arg5, %arg12 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %13:4 = scf.while (%arg13 = %felt_const_0, %arg14 = %arg11, %arg15 = %arg12, %arg16 = %arg10) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %14 = bool.cmp lt(%arg13, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%14) %arg13, %arg14, %arg15, %arg16 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg13: !felt.type<"babybear">, %arg14: !felt.type<"babybear">, %arg15: !felt.type<"babybear">, %arg16: !felt.type<"babybear">): + %nondet_31 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_31[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_31[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %12, %arg13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.umod %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.extract %nondet_18[%16] : <4,32 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg17 = %c0 to %c8 step %c1 { + %42 = cast.tofelt %arg17 : index, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %arg13, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.add %43, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.sub %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %17[%46] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_9[%48, %49, %50] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %52 = pod.read %51[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53] = %47 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_9[%54, %55, %56] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %57[@in] = %52 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_9[%58, %59, %60] = %57 : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %61 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %array_8[%61, %62, %63] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %64[@count] = %66 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %68 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %69 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%68) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %64[@comp] = %69 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %70 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%70, %71, %72] = %64 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_8[%18, %19, %20] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %23 = struct.readm %22[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %24 = function.call @emulated_aesenc_enc_table_1(%arg13, %23) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %28[@in] = %24 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%29, %30, %31] = %28 : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %32 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%32, %33, %34] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %42 = pod.read %28[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%42) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %35[@comp] = %43 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %44 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%44, %45, %46] = %35 : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %39 = bool.cmp eq(%arg13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40:2 = scf.if %39 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %42:2 = scf.while (%arg17 = %arg15, %arg18 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %43 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%43) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %43 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %45 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%45) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %45 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array[%45, %46, %c0] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %48 = pod.read %47[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %49 = struct.readm %48[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %50 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %51, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %49[%53] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %57 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %58 = felt.add %57, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array_2[%55, %56, %c0, %59] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %60[@a] = %54 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %63 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %64 = felt.add %63, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%61, %62, %c0, %65] = %60 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %66 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = felt.add %68, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_1[%66, %67, %c0, %70] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %72 = pod.read %71[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %71[@count] = %73 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %76 = pod.read %60[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = pod.read %60[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = function.call @XOR_0::@XOR_0::@compute(%76, %77) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %71[@comp] = %78 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %79 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = felt.add %81, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %82 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%79, %80, %c0, %83] = %71 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %75 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %75 : !felt.type<"babybear"> + } + %44 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %43, %44 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %42#1, %42#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %42 = bool.cmp lt(%arg13, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43:2 = scf.if %42 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %44:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %45 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%45) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %45 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %47 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%47) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array[%47, %48, %49] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %52 = struct.readm %51[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %53 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.add %53, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = felt.sub %54, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %52[%56] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %60 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = felt.add %62, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %65 = array.read %array_2[%58, %59, %61, %64] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %65[@b] = %57 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %70, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%66, %67, %69, %72] = %65 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %73 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = felt.add %77, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %array_1[%73, %74, %76, %79] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %81 = pod.read %80[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %82 = arith.subi %81, %c1 {product_source = "compute"} : index + pod.write %80[@count] = %82 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.cmpi eq, %82, %c0 {product_source = "compute"} : index + scf.if %83 { + %118 = pod.read %65[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %119 = pod.read %65[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %120 = function.call @XOR_0::@XOR_0::@compute(%118, %119) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %80[@comp] = %120 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %121 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %123 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %124 = cast.toindex %123 : !felt.type<"babybear"> {product_source = "compute"} + %125 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = felt.add %125, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %127 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%121, %122, %124, %127] = %80 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %84 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %86 = felt.sub %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %86 : !felt.type<"babybear"> {product_source = "compute"} + %88 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = felt.add %88, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %89 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %array_1[%84, %85, %87, %90] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %92 = pod.read %91[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %93 = struct.readm %92[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %94 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %97 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %array_2[%94, %95, %96, %99] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %100[@a] = %93 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %103 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %104 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %105 = felt.add %104, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%101, %102, %103, %106] = %100 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %107 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %108 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %109 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %110 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %111 = felt.add %110, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + %113 = array.read %array_1[%107, %108, %109, %112] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %114 = pod.read %113[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %115 = arith.subi %114, %c1 {product_source = "compute"} : index + pod.write %113[@count] = %115 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %116 = arith.cmpi eq, %115, %c0 {product_source = "compute"} : index + scf.if %116 { + %118 = pod.read %100[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %119 = pod.read %100[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %120 = function.call @XOR_0::@XOR_0::@compute(%118, %119) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %113[@comp] = %120 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %121 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %arg13 : !felt.type<"babybear"> {product_source = "compute"} + %124 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %125 = felt.add %124, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %125 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%121, %122, %123, %126] = %113 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %117 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %117 : !felt.type<"babybear"> + } + %46 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %46, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %44#0, %44#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %44:2 = scf.while (%arg17 = %felt_const_0, %arg18 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %45 = bool.cmp lt(%arg17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%45) %arg17, %arg18 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg17: !felt.type<"babybear">, %arg18: !felt.type<"babybear">): + %45 = scf.while (%arg19 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %47 = bool.cmp lt(%arg19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%47) %arg19 : !felt.type<"babybear"> + } do { + ^bb0(%arg19: !felt.type<"babybear">): + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%47, %48, %c3] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %51 = struct.readm %50[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %52 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.sub %53, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %51[%55] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = felt.add %59, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array_2[%57, %58, %c2, %61] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %62[@b] = %56 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %65 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66 = felt.add %65, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%63, %64, %c2, %67] = %62 : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %68 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %70 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %70, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_1[%68, %69, %c2, %72] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.subi %74, %c1 {product_source = "compute"} : index + pod.write %73[@count] = %75 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.cmpi eq, %75, %c0 {product_source = "compute"} : index + scf.if %76 { + %106 = pod.read %62[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %107 = pod.read %62[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %108 = function.call @XOR_0::@XOR_0::@compute(%106, %107) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %73[@comp] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %109 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %111 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = felt.add %111, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %113 = cast.toindex %112 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%109, %110, %c2, %113] = %73 : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %77 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %79 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = felt.add %79, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_1[%77, %78, %c2, %81] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %84 = struct.readm %83[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = felt.add %87, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %array_17[%85, %86, %89] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %90[@a] = %84 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %93 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.add %93, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %94 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_17[%91, %92, %95] = %90 : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %96 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = felt.add %98, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %99 : !felt.type<"babybear"> {product_source = "compute"} + %101 = array.read %array_16[%96, %97, %100] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %102 = pod.read %101[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %103 = arith.subi %102, %c1 {product_source = "compute"} : index + pod.write %101[@count] = %103 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.cmpi eq, %103, %c0 {product_source = "compute"} : index + scf.if %104 { + %106 = pod.read %90[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %107 = pod.read %90[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %108 = function.call @XOR_0::@XOR_0::@compute(%106, %107) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %101[@comp] = %108 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %109 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %111 = felt.mul %arg17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = felt.add %111, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %113 = cast.toindex %112 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_16[%109, %110, %113] = %101 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %105 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %105 : !felt.type<"babybear"> + } + %46 = felt.add %arg17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %46, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %44#0, %44#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %43#0, %43#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %41 = felt.add %arg13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %41, %24, %40#1, %40#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %13#0, %13#3, %13#1, %13#2 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %7 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %9 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %10 = scf.for %arg8 = %7 to %8 step %9 iter_args(%arg9 = %6#1) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %13 = bool.cmp lt(%12, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = scf.while (%arg10 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %16 = bool.cmp lt(%arg10, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%16) %arg10 : !felt.type<"babybear"> + } do { + ^bb0(%arg10: !felt.type<"babybear">): + %16 = felt.add %12, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %16, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %arg10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg1[%19] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_17[%21, %22, %23] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %24[@b] = %20 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_17[%25, %26, %27] = %24 : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %28 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_16[%28, %29, %30] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %44 = pod.read %24[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @XOR_0::@XOR_0::@compute(%44, %45) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %31[@comp] = %46 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_16[%47, %48, %49] = %31 : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %35 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_16[%35, %36, %37] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %arg10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%41, %42] = %40 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %arg10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %43 : !felt.type<"babybear"> + } + %15 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %14 : !felt.type<"babybear"> + } + %11 = felt.add %arg6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %6#3, %10, %6#2, %11, %6#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %nondet_22 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_22[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %0#4) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = bool.cmp lt(%10, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %23 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%23) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.sub %25, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %nondet_18[%23, %27] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_11[%31] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34] = %28 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_11[%37] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %38[@in] = %33 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %39 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_11[%41] = %38 : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %42 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %array_10[%44] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %46 = pod.read %45[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %45[@count] = %47 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %50 = pod.read %38[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %51 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%50) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %45[@comp] = %51 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %52 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_10[%54] = %45 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %49 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %49 : !felt.type<"babybear"> + } + %13 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_10[%15] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %17 = pod.read %16[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_22[%21] = %18 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %12 : !felt.type<"babybear"> + } + scf.yield %9 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_22[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_7[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@in] = %8 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %pod_7[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@compute(%13) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %7[%8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_13[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %10[%11] = %9 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_13[@in] = %10 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod_12[@count] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod_12[@count] = %13 : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_13[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %16 = function.call @EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4::@compute(%15) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + pod.write %pod_12[@comp] = %16 : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %1) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = bool.cmp lt(%10, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %14 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %13[%16] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %18, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_4[%20] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %21[@in] = %17 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%24] = %21 : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %25 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_3[%27] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %34 = pod.read %21[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %35 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%34) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + pod.write %28[@comp] = %35 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %36 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.add %36, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%38] = %28 : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %32 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %34 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%34) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %34 = felt.mul %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.add %34, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_3[%36] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %40 = felt.sub %felt_const_7, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %39[%41] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %44, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%43, %46] = %42 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %47 : !felt.type<"babybear"> + } + %33 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %32 : !felt.type<"babybear"> + } + scf.yield %9 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_18[%11, %12] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_6[%14, %15] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %16[@a] = %13 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%17, %18] = %16 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %19 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_5[%19, %20] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %49 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @XOR_0::@XOR_0::@compute(%49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %21[@comp] = %51 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %52 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%52, %53] = %21 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = felt.add %5, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %25, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.add %26, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg1[%28] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_6[%30, %31] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%33, %34] = %32 : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %35 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_5[%35, %36] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @XOR_0::@XOR_0::@compute(%49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %52 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%52, %53] = %37 : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_5[%41, %42] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_18[%46, %47] = %45 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_18[%11, %12] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %5, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %13 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@xor_3$inputs] = %array_17 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_23 = array.new : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %5 = array.read %array_16[%arg2, %arg3, %arg4] : <13,4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_23[%arg2, %arg3, %arg4] = %6 : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_3] = %array_23 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_1$inputs] = %array_0 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_24 = array.new : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_24[%arg2, %arg3, %arg4] = %6 : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@num2bits_1] = %array_24 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@row_shifting$inputs] = %pod_7 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + struct.writem %self[@row_shifting] = %3 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "compute"} + struct.writem %self[@bits2num_2$inputs] = %array_11 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_25 = array.new : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_10[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + array.write %array_25[%arg2] = %6 : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@bits2num_2] = %array_25 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + struct.writem %self[@bits2num_1$inputs] = %array_9 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_26 = array.new : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = array.read %array_8[%arg2, %arg3, %arg4] : <13,4,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + array.write %array_26[%arg2, %arg3, %arg4] = %6 : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@bits2num_1] = %array_26 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_2$inputs] = %array_4 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_27 = array.new : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %5 = array.read %array_3[%arg2] : <16 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + array.write %array_27[%arg2] = %6 : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@num2bits_2] = %array_27 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + struct.writem %self[@xor_4$inputs] = %array_6 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_28 = array.new : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_5[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_28[%arg2, %arg3] = %6 : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_4] = %array_28 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@sub_bytes$inputs] = %pod_13 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + struct.writem %self[@sub_bytes] = %4 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_15 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_29 = array.new : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %5 = array.read %array_14[%arg2, %arg3] : <4,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_29[%arg2, %arg3] = %6 : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_29 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@xor_2$inputs] = %array_2 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_30 = array.new : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %5 = array.read %array_1[%arg2, %arg3, %arg4, %arg5] : <13,4,3,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_30[%arg2, %arg3, %arg4, %arg5] = %6 : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_2] = %array_30 : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@AES256Encrypt_6::@AES256Encrypt_6<[]>>, %arg1: !array.type<128 x !felt.type<"babybear">>, %arg2: !array.type<1920 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c16 = arith.constant {product_source = "constrain"} 16 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c32 = arith.constant {product_source = "constrain"} 32 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c13 = arith.constant {product_source = "constrain"} 13 : index + %felt_const_56 = felt.const 56 : <"babybear"> {product_source = "constrain"} + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "constrain"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "constrain"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@num2bits_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@num2bits_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@xor_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@xor_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@num2bits_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@num2bits_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@xor_4] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@xor_4$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@row_shifting] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@row_shifting$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@bits2num_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "constrain"} + %12 = struct.readm %arg0[@bits2num_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %13 = struct.readm %arg0[@bits2num_2] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>> {product_source = "constrain"} + %14 = struct.readm %arg0[@bits2num_2$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %15 = struct.readm %arg0[@sub_bytes] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@sub_bytes$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@xor_1] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %18 = struct.readm %arg0[@xor_1$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %19 = struct.readm %arg0[@xor_3] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %20 = struct.readm %arg0[@xor_3$inputs] : <@AES256Encrypt_6::@AES256Encrypt_6<[]>>, !array.type<13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c1] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c2] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c3] = %nondet_0 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<4,32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_2[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_1[%c0] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c1] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c2] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c3] = %nondet_2 : <4,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %27 to %28 step %29 { + %30 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %31 = bool.cmp lt(%30, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.mul %26, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %arg1[%34] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %18[%36, %37] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %26, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %arg2[%43] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %18[%45, %46] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %17[%49, %50] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %52 = struct.readm %51[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%53, %54] = %52 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + %21:5 = scf.for %arg3 = %c0 to %c13 step %c1 iter_args(%arg4 = %felt_const_4, %arg5 = %felt_const_0, %arg6 = %felt_const_0, %arg7 = %felt_const_0, %arg8 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27:4 = scf.for %arg9 = %c0 to %c4 step %c1 iter_args(%arg10 = %arg6, %arg11 = %arg5, %arg12 = %arg7, %arg13 = %arg8) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %33 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %34:4 = scf.while (%arg14 = %arg12, %arg15 = %arg10, %arg16 = %felt_const_0, %arg17 = %arg13) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %35 = bool.cmp lt(%arg16, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%35) {product_source = "constrain"} %arg14, %arg15, %arg16, %arg17 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg14: !felt.type<"babybear">, %arg15: !felt.type<"babybear">, %arg16: !felt.type<"babybear">, %arg17: !felt.type<"babybear">): + %nondet_4 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_4[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %33, %arg16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.umod %35, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.extract %nondet[%37] : <4,32 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg18 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg18 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg16, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.sub %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %38[%52] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %arg16 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %12[%54, %55, %56] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %39 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %arg16 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %11[%39, %40, %41] : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %43 = struct.readm %42[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = function.call @emulated_aesenc_enc_table_1(%arg16, %43) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + %45 = bool.cmp eq(%arg16, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46:2 = scf.if %45 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %48:2 = scf.while (%arg18 = %arg15, %arg19 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %49 = bool.cmp lt(%arg19, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%49) {product_source = "constrain"} %arg18, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg18: !felt.type<"babybear">, %arg19: !felt.type<"babybear">): + %49 = scf.while (%arg20 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %51 = bool.cmp lt(%arg20, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%51) {product_source = "constrain"} %arg20 : !felt.type<"babybear"> + } do { + ^bb0(%arg20: !felt.type<"babybear">): + %51 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %1[%51, %52, %c0] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %54 = struct.readm %53[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %55, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.sub %56, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %54[%58] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = felt.add %62, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %4[%60, %61, %c0, %64] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %66 = pod.read %65[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %67 = felt.add %arg20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %67 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %50 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %49, %50 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %48#0, %48#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %48 = bool.cmp lt(%arg16, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49:2 = scf.if %48 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %50:2 = scf.while (%arg18 = %felt_const_0, %arg19 = %arg15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %51 = bool.cmp lt(%arg18, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%51) {product_source = "constrain"} %arg18, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg18: !felt.type<"babybear">, %arg19: !felt.type<"babybear">): + %51 = scf.while (%arg20 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %53 = bool.cmp lt(%arg20, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%53) {product_source = "constrain"} %arg20 : !felt.type<"babybear"> + } do { + ^bb0(%arg20: !felt.type<"babybear">): + %53 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %arg16 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %1[%53, %54, %55] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %57 = struct.readm %56[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = felt.add %58, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.sub %59, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %57[%61] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = felt.sub %arg16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %67, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %4[%63, %64, %66, %69] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %71 = pod.read %70[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.sub %arg16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %77 = felt.add %76, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %3[%72, %73, %75, %78] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %80 = struct.readm %79[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = cast.toindex %arg16 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = felt.mul %arg18, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %85 = felt.add %84, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "constrain"} + %87 = array.read %4[%81, %82, %83, %86] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %88 = pod.read %87[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %88, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %89 = felt.add %arg20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %89 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %52 = felt.add %arg18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %52, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %50#1, %50#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %50:2 = scf.while (%arg18 = %arg15, %arg19 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %51 = bool.cmp lt(%arg19, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%51) {product_source = "constrain"} %arg18, %arg19 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg18: !felt.type<"babybear">, %arg19: !felt.type<"babybear">): + %51 = scf.while (%arg20 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %53 = bool.cmp lt(%arg20, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%53) {product_source = "constrain"} %arg20 : !felt.type<"babybear"> + } do { + ^bb0(%arg20: !felt.type<"babybear">): + %53 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %1[%53, %54, %c3] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %56 = struct.readm %55[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %57, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = felt.sub %58, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %56[%60] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = felt.add %64, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %4[%62, %63, %c2, %66] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %68 = pod.read %67[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = felt.add %71, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "constrain"} + %74 = array.read %3[%69, %70, %c2, %73] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %75 = struct.readm %74[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %78 = felt.mul %arg19, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %79 = felt.add %78, %arg20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %20[%76, %77, %80] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %82 = pod.read %81[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %82, %75 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %83 = felt.add %arg20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %83 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %52 = felt.add %arg19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %51, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %50#0, %50#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %49#0, %49#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %47 = felt.add %arg16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %46#1, %46#0, %47, %44 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.yield {product_source = "constrain"} %34#1, %34#2, %34#0, %34#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %28 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %30 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %31 = scf.for %arg9 = %28 to %29 step %30 iter_args(%arg10 = %27#2) -> (!felt.type<"babybear">) { + %33 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %34 = bool.cmp lt(%33, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = scf.while (%arg11 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %37 = bool.cmp lt(%arg11, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%37) %arg11 : !felt.type<"babybear"> + } do { + ^bb0(%arg11: !felt.type<"babybear">): + %37 = felt.add %33, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %38, %arg11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %arg2[%40] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %arg11 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %20[%42, %43, %44] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %arg11 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %19[%47, %48, %49] : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %arg11 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%52, %53] = %51 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %arg11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %54 : !felt.type<"babybear"> + } + %36 = felt.add %33, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %35 : !felt.type<"babybear"> + } + %32 = felt.add %arg4, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %32, %27#1, %27#0, %31, %27#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %nondet_3 = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_3[%c0] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c1] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c2] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c3] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c4] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c5] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c7] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c8] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c9] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c10] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c11] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c12] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c13] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c14] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c15] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %21#1) -> (!felt.type<"babybear">) { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %30 = scf.for %arg5 = %27 to %28 step %29 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %32 = bool.cmp lt(%31, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %43 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%43) {product_source = "constrain"} %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %43 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %31, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.sub %45, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %nondet[%43, %47] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %14[%51] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %53 = pod.read %52[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %54 = cast.toindex %arg7 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %53[%54] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %56 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %34 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %13[%36] : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %38 = struct.readm %37[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %39, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%41] = %38 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %31, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %33 : !felt.type<"babybear"> + } + scf.yield %30 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %nondet_3[%27] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %10[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = struct.readm %9[@out] : <@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %16[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %23 = scf.for %arg3 = %c0 to %c4 step %c1 iter_args(%arg4 = %22) -> (!felt.type<"babybear">) { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %30 = scf.for %arg5 = %27 to %28 step %29 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %31 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %32 = bool.cmp lt(%31, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = struct.readm %15[@out] : <@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %33[%36] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %38, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %6[%40] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %45 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%45) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %45 = felt.mul %26, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %5[%47] : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %49 = struct.readm %48[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = felt.sub %felt_const_7, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %49[%51] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.mul %31, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %54, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%53, %56] = %52 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %57 : !felt.type<"babybear"> + } + %44 = felt.add %31, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %43 : !felt.type<"babybear"> + } + scf.yield %30 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %27 to %28 step %29 { + %30 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %31 = bool.cmp lt(%30, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %nondet[%32, %33] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %8[%35, %36] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %26, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %40, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %arg2[%42] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %8[%44, %45] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %47 = pod.read %46[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %7[%48, %49] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%52, %53] = %51 : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %28 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %29 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %27 to %28 step %29 { + %30 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %31 = bool.cmp lt(%30, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %nondet[%32, %33] : <4,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %26, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.add %35, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %0[%37] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c32 step %c1 { + %26 = array.read %19[%arg3, %arg4, %arg5] : <13,4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %27 = array.read %20[%arg3, %arg4, %arg5] : <13,4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %26 = array.read %1[%arg3, %arg4, %arg5] : <13,4,4 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %27 = array.read %2[%arg3, %arg4, %arg5] : <13,4,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%26, %28) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %24 = pod.read %10[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3::@constrain(%9, %24) : (!struct.type<@EmulatedAesencRowShifting_3::@EmulatedAesencRowShifting_3<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = array.read %13[%arg3] : <16 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %27 = array.read %14[%arg3] : <16 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%26, %28) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %26 = array.read %11[%arg3, %arg4, %arg5] : <13,4,4 x !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %27 = array.read %12[%arg3, %arg4, %arg5] : <13,4,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%26, %28) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c16 step %c1 { + %26 = array.read %5[%arg3] : <16 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %27 = array.read %6[%arg3] : <16 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%26, %28) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %26 = array.read %7[%arg3, %arg4] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %27 = array.read %8[%arg3, %arg4] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %25 = pod.read %16[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4::@constrain(%15, %25) : (!struct.type<@EmulatedAesencSubstituteBytes_4::@EmulatedAesencSubstituteBytes_4<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + scf.for %arg4 = %c0 to %c32 step %c1 { + %26 = array.read %17[%arg3, %arg4] : <4,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %27 = array.read %18[%arg3, %arg4] : <4,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + scf.for %arg5 = %c0 to %c3 step %c1 { + scf.for %arg6 = %c0 to %c32 step %c1 { + %26 = array.read %3[%arg3, %arg4, %arg5, %arg6] : <13,4,3,32 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %27 = array.read %4[%arg3, %arg4, %arg5, %arg6] : <13,4,3,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%26, %28, %29) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/aes_256_key_expansion_test.llzk b/examples/circom-demo/aes_256_key_expansion_test.llzk new file mode 100644 index 0000000..a6702cb --- /dev/null +++ b/examples/circom-demo/aes_256_key_expansion_test.llzk @@ -0,0 +1,4832 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>} { + function.def @emulated_aesenc_rijndael_sbox_0(%arg0: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c255 = arith.constant 255 : index + %c254 = arith.constant 254 : index + %c253 = arith.constant 253 : index + %c252 = arith.constant 252 : index + %c251 = arith.constant 251 : index + %c250 = arith.constant 250 : index + %c249 = arith.constant 249 : index + %c248 = arith.constant 248 : index + %c247 = arith.constant 247 : index + %c246 = arith.constant 246 : index + %c245 = arith.constant 245 : index + %c244 = arith.constant 244 : index + %c243 = arith.constant 243 : index + %c242 = arith.constant 242 : index + %c241 = arith.constant 241 : index + %c240 = arith.constant 240 : index + %c239 = arith.constant 239 : index + %c238 = arith.constant 238 : index + %c237 = arith.constant 237 : index + %c236 = arith.constant 236 : index + %c235 = arith.constant 235 : index + %c234 = arith.constant 234 : index + %c233 = arith.constant 233 : index + %c232 = arith.constant 232 : index + %c231 = arith.constant 231 : index + %c230 = arith.constant 230 : index + %c229 = arith.constant 229 : index + %c228 = arith.constant 228 : index + %c227 = arith.constant 227 : index + %c226 = arith.constant 226 : index + %c225 = arith.constant 225 : index + %c224 = arith.constant 224 : index + %c223 = arith.constant 223 : index + %c222 = arith.constant 222 : index + %c221 = arith.constant 221 : index + %c220 = arith.constant 220 : index + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_255 = felt.const 255 : <"babybear"> + %felt_const_254 = felt.const 254 : <"babybear"> + %felt_const_253 = felt.const 253 : <"babybear"> + %felt_const_252 = felt.const 252 : <"babybear"> + %felt_const_251 = felt.const 251 : <"babybear"> + %felt_const_250 = felt.const 250 : <"babybear"> + %felt_const_249 = felt.const 249 : <"babybear"> + %felt_const_248 = felt.const 248 : <"babybear"> + %felt_const_247 = felt.const 247 : <"babybear"> + %felt_const_246 = felt.const 246 : <"babybear"> + %felt_const_245 = felt.const 245 : <"babybear"> + %felt_const_244 = felt.const 244 : <"babybear"> + %felt_const_243 = felt.const 243 : <"babybear"> + %felt_const_242 = felt.const 242 : <"babybear"> + %felt_const_241 = felt.const 241 : <"babybear"> + %felt_const_240 = felt.const 240 : <"babybear"> + %felt_const_239 = felt.const 239 : <"babybear"> + %felt_const_238 = felt.const 238 : <"babybear"> + %felt_const_237 = felt.const 237 : <"babybear"> + %felt_const_236 = felt.const 236 : <"babybear"> + %felt_const_235 = felt.const 235 : <"babybear"> + %felt_const_234 = felt.const 234 : <"babybear"> + %felt_const_233 = felt.const 233 : <"babybear"> + %felt_const_232 = felt.const 232 : <"babybear"> + %felt_const_231 = felt.const 231 : <"babybear"> + %felt_const_230 = felt.const 230 : <"babybear"> + %felt_const_229 = felt.const 229 : <"babybear"> + %felt_const_228 = felt.const 228 : <"babybear"> + %felt_const_227 = felt.const 227 : <"babybear"> + %felt_const_226 = felt.const 226 : <"babybear"> + %felt_const_225 = felt.const 225 : <"babybear"> + %felt_const_224 = felt.const 224 : <"babybear"> + %felt_const_223 = felt.const 223 : <"babybear"> + %felt_const_222 = felt.const 222 : <"babybear"> + %felt_const_221 = felt.const 221 : <"babybear"> + %felt_const_220 = felt.const 220 : <"babybear"> + %felt_const_219 = felt.const 219 : <"babybear"> + %felt_const_218 = felt.const 218 : <"babybear"> + %felt_const_217 = felt.const 217 : <"babybear"> + %felt_const_216 = felt.const 216 : <"babybear"> + %felt_const_215 = felt.const 215 : <"babybear"> + %felt_const_214 = felt.const 214 : <"babybear"> + %felt_const_213 = felt.const 213 : <"babybear"> + %felt_const_212 = felt.const 212 : <"babybear"> + %felt_const_211 = felt.const 211 : <"babybear"> + %felt_const_210 = felt.const 210 : <"babybear"> + %felt_const_209 = felt.const 209 : <"babybear"> + %felt_const_208 = felt.const 208 : <"babybear"> + %felt_const_207 = felt.const 207 : <"babybear"> + %felt_const_206 = felt.const 206 : <"babybear"> + %felt_const_205 = felt.const 205 : <"babybear"> + %felt_const_204 = felt.const 204 : <"babybear"> + %felt_const_203 = felt.const 203 : <"babybear"> + %felt_const_202 = felt.const 202 : <"babybear"> + %felt_const_201 = felt.const 201 : <"babybear"> + %felt_const_200 = felt.const 200 : <"babybear"> + %felt_const_199 = felt.const 199 : <"babybear"> + %felt_const_198 = felt.const 198 : <"babybear"> + %felt_const_197 = felt.const 197 : <"babybear"> + %felt_const_196 = felt.const 196 : <"babybear"> + %felt_const_195 = felt.const 195 : <"babybear"> + %felt_const_194 = felt.const 194 : <"babybear"> + %felt_const_193 = felt.const 193 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_191 = felt.const 191 : <"babybear"> + %felt_const_190 = felt.const 190 : <"babybear"> + %felt_const_189 = felt.const 189 : <"babybear"> + %felt_const_188 = felt.const 188 : <"babybear"> + %felt_const_187 = felt.const 187 : <"babybear"> + %felt_const_186 = felt.const 186 : <"babybear"> + %felt_const_185 = felt.const 185 : <"babybear"> + %felt_const_184 = felt.const 184 : <"babybear"> + %felt_const_183 = felt.const 183 : <"babybear"> + %felt_const_182 = felt.const 182 : <"babybear"> + %felt_const_181 = felt.const 181 : <"babybear"> + %felt_const_180 = felt.const 180 : <"babybear"> + %felt_const_179 = felt.const 179 : <"babybear"> + %felt_const_178 = felt.const 178 : <"babybear"> + %felt_const_177 = felt.const 177 : <"babybear"> + %felt_const_176 = felt.const 176 : <"babybear"> + %felt_const_175 = felt.const 175 : <"babybear"> + %felt_const_174 = felt.const 174 : <"babybear"> + %felt_const_173 = felt.const 173 : <"babybear"> + %felt_const_172 = felt.const 172 : <"babybear"> + %felt_const_171 = felt.const 171 : <"babybear"> + %felt_const_170 = felt.const 170 : <"babybear"> + %felt_const_169 = felt.const 169 : <"babybear"> + %felt_const_168 = felt.const 168 : <"babybear"> + %felt_const_167 = felt.const 167 : <"babybear"> + %felt_const_166 = felt.const 166 : <"babybear"> + %felt_const_165 = felt.const 165 : <"babybear"> + %felt_const_164 = felt.const 164 : <"babybear"> + %felt_const_163 = felt.const 163 : <"babybear"> + %felt_const_162 = felt.const 162 : <"babybear"> + %felt_const_161 = felt.const 161 : <"babybear"> + %felt_const_160 = felt.const 160 : <"babybear"> + %felt_const_159 = felt.const 159 : <"babybear"> + %felt_const_158 = felt.const 158 : <"babybear"> + %felt_const_157 = felt.const 157 : <"babybear"> + %felt_const_156 = felt.const 156 : <"babybear"> + %felt_const_155 = felt.const 155 : <"babybear"> + %felt_const_154 = felt.const 154 : <"babybear"> + %felt_const_153 = felt.const 153 : <"babybear"> + %felt_const_152 = felt.const 152 : <"babybear"> + %felt_const_151 = felt.const 151 : <"babybear"> + %felt_const_150 = felt.const 150 : <"babybear"> + %felt_const_149 = felt.const 149 : <"babybear"> + %felt_const_148 = felt.const 148 : <"babybear"> + %felt_const_147 = felt.const 147 : <"babybear"> + %felt_const_146 = felt.const 146 : <"babybear"> + %felt_const_145 = felt.const 145 : <"babybear"> + %felt_const_144 = felt.const 144 : <"babybear"> + %felt_const_143 = felt.const 143 : <"babybear"> + %felt_const_142 = felt.const 142 : <"babybear"> + %felt_const_141 = felt.const 141 : <"babybear"> + %felt_const_140 = felt.const 140 : <"babybear"> + %felt_const_139 = felt.const 139 : <"babybear"> + %felt_const_138 = felt.const 138 : <"babybear"> + %felt_const_137 = felt.const 137 : <"babybear"> + %felt_const_136 = felt.const 136 : <"babybear"> + %felt_const_135 = felt.const 135 : <"babybear"> + %felt_const_134 = felt.const 134 : <"babybear"> + %felt_const_133 = felt.const 133 : <"babybear"> + %felt_const_132 = felt.const 132 : <"babybear"> + %felt_const_131 = felt.const 131 : <"babybear"> + %felt_const_130 = felt.const 130 : <"babybear"> + %felt_const_129 = felt.const 129 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_127 = felt.const 127 : <"babybear"> + %felt_const_126 = felt.const 126 : <"babybear"> + %felt_const_125 = felt.const 125 : <"babybear"> + %felt_const_124 = felt.const 124 : <"babybear"> + %felt_const_123 = felt.const 123 : <"babybear"> + %felt_const_122 = felt.const 122 : <"babybear"> + %felt_const_121 = felt.const 121 : <"babybear"> + %felt_const_120 = felt.const 120 : <"babybear"> + %felt_const_119 = felt.const 119 : <"babybear"> + %felt_const_118 = felt.const 118 : <"babybear"> + %felt_const_117 = felt.const 117 : <"babybear"> + %felt_const_116 = felt.const 116 : <"babybear"> + %felt_const_115 = felt.const 115 : <"babybear"> + %felt_const_114 = felt.const 114 : <"babybear"> + %felt_const_113 = felt.const 113 : <"babybear"> + %felt_const_112 = felt.const 112 : <"babybear"> + %felt_const_111 = felt.const 111 : <"babybear"> + %felt_const_110 = felt.const 110 : <"babybear"> + %felt_const_109 = felt.const 109 : <"babybear"> + %felt_const_108 = felt.const 108 : <"babybear"> + %felt_const_107 = felt.const 107 : <"babybear"> + %felt_const_106 = felt.const 106 : <"babybear"> + %felt_const_105 = felt.const 105 : <"babybear"> + %felt_const_104 = felt.const 104 : <"babybear"> + %felt_const_103 = felt.const 103 : <"babybear"> + %felt_const_102 = felt.const 102 : <"babybear"> + %felt_const_101 = felt.const 101 : <"babybear"> + %felt_const_100 = felt.const 100 : <"babybear"> + %felt_const_99 = felt.const 99 : <"babybear"> + %felt_const_98 = felt.const 98 : <"babybear"> + %felt_const_97 = felt.const 97 : <"babybear"> + %felt_const_96 = felt.const 96 : <"babybear"> + %felt_const_95 = felt.const 95 : <"babybear"> + %felt_const_94 = felt.const 94 : <"babybear"> + %felt_const_93 = felt.const 93 : <"babybear"> + %felt_const_92 = felt.const 92 : <"babybear"> + %felt_const_91 = felt.const 91 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_89 = felt.const 89 : <"babybear"> + %felt_const_88 = felt.const 88 : <"babybear"> + %felt_const_87 = felt.const 87 : <"babybear"> + %felt_const_86 = felt.const 86 : <"babybear"> + %felt_const_85 = felt.const 85 : <"babybear"> + %felt_const_84 = felt.const 84 : <"babybear"> + %felt_const_83 = felt.const 83 : <"babybear"> + %felt_const_82 = felt.const 82 : <"babybear"> + %felt_const_81 = felt.const 81 : <"babybear"> + %felt_const_80 = felt.const 80 : <"babybear"> + %felt_const_79 = felt.const 79 : <"babybear"> + %felt_const_78 = felt.const 78 : <"babybear"> + %felt_const_77 = felt.const 77 : <"babybear"> + %felt_const_76 = felt.const 76 : <"babybear"> + %felt_const_75 = felt.const 75 : <"babybear"> + %felt_const_74 = felt.const 74 : <"babybear"> + %felt_const_73 = felt.const 73 : <"babybear"> + %felt_const_72 = felt.const 72 : <"babybear"> + %felt_const_71 = felt.const 71 : <"babybear"> + %felt_const_70 = felt.const 70 : <"babybear"> + %felt_const_69 = felt.const 69 : <"babybear"> + %felt_const_68 = felt.const 68 : <"babybear"> + %felt_const_67 = felt.const 67 : <"babybear"> + %felt_const_66 = felt.const 66 : <"babybear"> + %felt_const_65 = felt.const 65 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_60 = felt.const 60 : <"babybear"> + %felt_const_59 = felt.const 59 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_57 = felt.const 57 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_53 = felt.const 53 : <"babybear"> + %felt_const_52 = felt.const 52 : <"babybear"> + %felt_const_51 = felt.const 51 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_48 = felt.const 48 : <"babybear"> + %felt_const_47 = felt.const 47 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_42 = felt.const 42 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %felt_const_40 = felt.const 40 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_38 = felt.const 38 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_35 = felt.const 35 : <"babybear"> + %felt_const_34 = felt.const 34 : <"babybear"> + %felt_const_33 = felt.const 33 : <"babybear"> + %felt_const_32 = felt.const 32 : <"babybear"> + %felt_const_31 = felt.const 31 : <"babybear"> + %felt_const_30 = felt.const 30 : <"babybear"> + %felt_const_29 = felt.const 29 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %felt_const_26 = felt.const 26 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_24 = felt.const 24 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_22 = felt.const 22 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %felt_const_17 = felt.const 17 : <"babybear"> + %felt_const_16 = felt.const 16 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %felt_const_13 = felt.const 13 : <"babybear"> + %felt_const_12 = felt.const 12 : <"babybear"> + %felt_const_11 = felt.const 11 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_7 = felt.const 7 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %felt_const_5 = felt.const 5 : <"babybear"> + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c218] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c219] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c220] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c221] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c222] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c223] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c224] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c225] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c226] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c227] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c228] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c229] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c230] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c231] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c232] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c233] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c234] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c235] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c236] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c237] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c238] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c239] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c240] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c241] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c242] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c243] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c244] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c245] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c246] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c247] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c248] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c249] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c250] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c251] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c252] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c253] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c255] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_99 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_124 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_119 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_123 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_242 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_107 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_111 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_197 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_48 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_1 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_103 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_43 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_254 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_215 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_171 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_118 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_202 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_130 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_201 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_125 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_250 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_89 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_71 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_240 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_173 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_212 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_162 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_175 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_156 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_164 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_114 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_192 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_183 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_253 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_147 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_38 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_54 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_63 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_247 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_204 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_52 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_165 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_229 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_241 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_113 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_216 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_49 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_21 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_199 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_35 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_195 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_24 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_150 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_5 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_154 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_7 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_18 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_128 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_226 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_235 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_39 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_178 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_117 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_9 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_131 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_44 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_26 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_27 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_110 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_90 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_160 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_82 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_59 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_214 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_179 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_41 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_227 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_47 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_132 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_83 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_209 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_237 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_32 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_252 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_177 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_91 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_106 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_203 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_190 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_57 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_74 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_76 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_88 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_207 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_208 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_239 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_170 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_251 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_67 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_77 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_51 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_133 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_69 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_249 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_2 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_127 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_80 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_60 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_159 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_168 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_81 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_163 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_64 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_143 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_146 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_157 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_56 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_245 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_188 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_182 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_218 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_33 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_16 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_255 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_243 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_210 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_205 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_12 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_19 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_236 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_95 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_151 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_68 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_23 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_196 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_167 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_126 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_61 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_100 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_93 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_25 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_115 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_96 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_129 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_79 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_220 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_34 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_42 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_144 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_136 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_70 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_238 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_184 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_20 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_222 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_94 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_11 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_219 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_224 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_50 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_58 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_10 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_73 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_6 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_36 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_92 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_194 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_211 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_172 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_98 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_145 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_149 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_228 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_121 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_231 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_200 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_55 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_109 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_141 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_213 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_78 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_169 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_108 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_86 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_244 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_234 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_101 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_122 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_174 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_8 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_186 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_120 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_37 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_46 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_28 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_166 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_180 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_198 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_232 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_221 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_116 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_31 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_75 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_189 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_139 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_138 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_112 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_62 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_181 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_102 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_72 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_246 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_14 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_97 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_53 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c218] = %felt_const_87 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c219] = %felt_const_185 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c220] = %felt_const_134 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c221] = %felt_const_193 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c222] = %felt_const_29 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c223] = %felt_const_158 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c224] = %felt_const_225 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c225] = %felt_const_248 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c226] = %felt_const_152 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c227] = %felt_const_17 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c228] = %felt_const_105 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c229] = %felt_const_217 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c230] = %felt_const_142 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c231] = %felt_const_148 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c232] = %felt_const_155 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c233] = %felt_const_30 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c234] = %felt_const_135 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c235] = %felt_const_233 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c236] = %felt_const_206 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c237] = %felt_const_85 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c238] = %felt_const_40 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c239] = %felt_const_223 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c240] = %felt_const_140 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c241] = %felt_const_161 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c242] = %felt_const_137 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c243] = %felt_const_13 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c244] = %felt_const_191 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c245] = %felt_const_230 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c246] = %felt_const_66 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c247] = %felt_const_104 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c248] = %felt_const_65 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c249] = %felt_const_153 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c250] = %felt_const_45 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c251] = %felt_const_15 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c252] = %felt_const_176 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c253] = %felt_const_84 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c254] = %felt_const_187 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c255] = %felt_const_22 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg0 : !felt.type<"babybear"> + %1 = array.read %nondet[%0] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %1 : !felt.type<"babybear"> + } + poly.template @Bits2Num_0 { + struct.def @Bits2Num_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @XOR_2 { + struct.def @XOR_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_2::@XOR_2<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_2::@XOR_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_2::@XOR_2<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @AES256KeyExpansion_3 { + struct.def @AES256KeyExpansion_3 { + struct.member @w : !array.type<1920 x !felt.type<"babybear">> {llzk.pub} + struct.member @xor_1 : !array.type<60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> + struct.member @xor_1$inputs : !array.type<60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @bits2num_1 : !array.type<60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> + struct.member @bits2num_1$inputs : !array.type<60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> + struct.member @num2bits_1 : !array.type<60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> + struct.member @num2bits_1$inputs : !array.type<60,5 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @xor_2 : !array.type<60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> + struct.member @xor_2$inputs : !array.type<60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<256 x !felt.type<"babybear">>) -> !struct.type<@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %felt_const_24 = felt.const 24 : <"babybear"> {product_source = "compute"} + %felt_const_54 = felt.const 54 : <"babybear"> {product_source = "compute"} + %felt_const_27 = felt.const 27 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "compute"} + %felt_const_16 = felt.const 16 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c5 = arith.constant {product_source = "compute"} 5 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c60 = arith.constant {product_source = "compute"} 60 : index + %self = struct.new : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c32 step %c1 { + %15 = array.read %array[%arg1, %arg2] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2] = %15 : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + %15 = array.read %array_1[%arg1, %arg2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1, %arg2] = %15 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + %15 = array.read %array_3[%arg1, %arg2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg1, %arg2] = %15 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c8 step %c1 { + %15 = array.read %array_5[%arg1, %arg2] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg1, %arg2] = %15 : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_1 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_2 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_4 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_16 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_32 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_64 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_128 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_27 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_54 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_8 = llzk.nondet : !array.type<60,32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_9[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_8[%c0] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c1] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c2] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c3] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c4] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c5] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c6] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c7] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c8] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c9] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c10] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c11] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c12] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c13] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c14] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c15] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c16] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c17] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c18] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c19] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c20] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c21] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c22] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c23] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c24] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c25] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c26] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c27] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c28] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c29] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c30] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c31] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c32] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c33] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c34] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c35] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c36] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c37] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c38] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c39] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c40] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c41] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c42] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c43] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c44] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c45] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c46] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c47] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c48] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c49] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c50] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c51] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c52] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c53] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c54] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c55] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c56] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c57] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c58] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c59] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<32,8 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_11 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_11[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_10[%c0] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c1] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c2] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c3] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c4] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c5] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c6] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c7] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c8] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c9] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c10] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c11] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c12] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c13] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c14] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c15] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c16] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c17] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c18] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c19] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c20] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c21] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c22] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c23] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c24] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c25] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c26] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c27] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c28] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c29] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c30] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c31] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %17 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %18 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %16 to %17 step %18 { + %19 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %20 = bool.cmp lt(%19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.mul %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.add %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%25, %26] = %24 : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + %0:2 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %15 = bool.cmp lt(%arg1, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%15) %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">): + %15 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %16 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %17 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %18 = scf.for %arg3 = %15 to %16 step %17 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %20 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %21 = bool.cmp lt(%20, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %24 = bool.cmp lt(%arg5, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%24) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %24 = felt.mul %arg1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %nondet_10[%26, %27] : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %arg1 : !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.mul %20, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %30, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%29, %32] = %28 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %33 : !felt.type<"babybear"> + } + %23 = felt.add %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %22 : !felt.type<"babybear"> + } + %19 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %1 = cast.toindex %0#0 : !felt.type<"babybear"> {product_source = "compute"} + %2:4 = scf.for %arg1 = %1 to %c60 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %nondet_21 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_21[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_21[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.extract %nondet_8[%17] : <60,32 x !felt.type<"babybear">> {product_source = "compute"} + %19 = felt.umod %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = bool.cmp eq(%19, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21:4 = scf.if %20 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %94 = cast.toindex %93 : !felt.type<"babybear"> {product_source = "compute"} + %95 = array.read %18[%94] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %97 = array.read %array_2[%96, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %98 = pod.read %97[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %99 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %98[%99] = %95 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %101 = array.read %array_2[%100, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %101[@in] = %98 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%102, %c0] = %101 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %103 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %104 = array.read %array_1[%103, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %105 = pod.read %104[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %106 = arith.subi %105, %c1 {product_source = "compute"} : index + pod.write %104[@count] = %106 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.cmpi eq, %106, %c0 {product_source = "compute"} : index + scf.if %107 { + %108 = pod.read %101[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %109 = function.call @Bits2Num_0::@Bits2Num_0::@product(%108) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + %110 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%108) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %104[@comp] = %109 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %111 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%111, %c0] = %104 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_1[%25, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %28 = struct.readm %27[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @emulated_aesenc_rijndael_sbox_0(%28) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_4[%30, %c0] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %31[@in] = %29 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%32, %c0] = %31 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %33 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_3[%33, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %92 = pod.read %31[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %93 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%92) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %34[@comp] = %93 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%94, %c0] = %34 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.add %93, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %94 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %18[%95] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %98 = array.read %array_2[%97, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %99 = pod.read %98[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %100 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %99[%100] = %96 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_2[%101, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %102[@in] = %99 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %103 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%103, %c1] = %102 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %104 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array_1[%104, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %109 = pod.read %102[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %110 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%109) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %105[@comp] = %110 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %111 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%111, %c1] = %105 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %38 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_1[%38, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %42 = function.call @emulated_aesenc_rijndael_sbox_0(%41) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_4[%43, %c1] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %44[@in] = %42 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%45, %c1] = %44 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %46 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_3[%46, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %48 = pod.read %47[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %47[@count] = %49 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %92 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %93 = function.call @Num2Bits_1::@Num2Bits_1::@product(%92) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %94 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%92) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %47[@comp] = %93 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %95 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%95, %c1] = %47 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.add %93, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %94 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %18[%95] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %98 = array.read %array_2[%97, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %99 = pod.read %98[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %100 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %99[%100] = %96 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_2[%101, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %102[@in] = %99 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %103 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%103, %c2] = %102 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %104 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array_1[%104, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %109 = pod.read %102[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %110 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%109) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %105[@comp] = %110 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %111 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%111, %c2] = %105 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %51 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %array_1[%51, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %53 = pod.read %52[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %54 = struct.readm %53[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %55 = function.call @emulated_aesenc_rijndael_sbox_0(%54) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_4[%56, %c2] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %57[@in] = %55 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%58, %c2] = %57 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %59 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array_3[%59, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.subi %61, %c1 {product_source = "compute"} : index + pod.write %60[@count] = %62 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.cmpi eq, %62, %c0 {product_source = "compute"} : index + scf.if %63 { + %92 = pod.read %57[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %93 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%92) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %60[@comp] = %93 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%94, %c2] = %60 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.add %93, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %94 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %18[%95] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %98 = array.read %array_2[%97, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %99 = pod.read %98[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %100 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %99[%100] = %96 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_2[%101, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %102[@in] = %99 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %103 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%103, %c3] = %102 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %104 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array_1[%104, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %109 = pod.read %102[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %110 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%109) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %105[@comp] = %110 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %111 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%111, %c3] = %105 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %64 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %65 = array.read %array_1[%64, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %66 = pod.read %65[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %67 = struct.readm %66[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %68 = function.call @emulated_aesenc_rijndael_sbox_0(%67) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_4[%69, %c3] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %70[@in] = %68 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%71, %c3] = %70 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %72 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_3[%72, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.subi %74, %c1 {product_source = "compute"} : index + pod.write %73[@count] = %75 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.cmpi eq, %75, %c0 {product_source = "compute"} : index + scf.if %76 { + %92 = pod.read %70[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %93 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%92) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %73[@comp] = %93 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%94, %c3] = %73 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_3[%93, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %96 = struct.readm %95[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %97 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %96[%98] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %92, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%101] = %99 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_3[%93, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %96 = struct.readm %95[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %97 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %96[%98] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%100] = %99 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_3[%93, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %96 = struct.readm %95[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %97 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %96[%98] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %92, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%101] = %99 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_3[%93, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %96 = struct.readm %95[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %97 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %96[%98] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %92, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%101] = %99 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %77 = felt.div %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = felt.sub %77, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %nondet_7[%79] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_4[%81, %c4] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %82[@in] = %80 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%83, %c4] = %82 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %84 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_3[%84, %c4] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %85[@count] = %87 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %92 = pod.read %82[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %93 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%92) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %85[@comp] = %93 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%94, %c4] = %85 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %89 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %90 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %91 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %89 to %90 step %91 { + %92 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %93 = bool.cmp lt(%92, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %94 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %95 = array.read %18[%94] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %98 = array.read %array_6[%96, %97] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %98[@a] = %95 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%99, %100] = %98 : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %101 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %103 = array.read %array_5[%101, %102] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %104 = pod.read %103[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.subi %104, %c1 {product_source = "compute"} : index + pod.write %103[@count] = %105 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %106 = arith.cmpi eq, %105, %c0 {product_source = "compute"} : index + scf.if %106 { + %132 = pod.read %98[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %98[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %134 = function.call @XOR_2::@XOR_2::@compute(%132, %133) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %103[@comp] = %134 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %135 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %136 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%135, %136] = %103 : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %107 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %108 = array.read %array_3[%107, %c4] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %109 = pod.read %108[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %110 = struct.readm %109[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %111 = felt.sub %felt_const_7, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + %113 = array.read %110[%112] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %114 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %116 = array.read %array_6[%114, %115] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %116[@b] = %113 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %118 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%117, %118] = %116 : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %119 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %120 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %121 = array.read %array_5[%119, %120] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %122 = pod.read %121[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %123 = arith.subi %122, %c1 {product_source = "compute"} : index + pod.write %121[@count] = %123 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %124 = arith.cmpi eq, %123, %c0 {product_source = "compute"} : index + scf.if %124 { + %132 = pod.read %116[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %116[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %134 = function.call @XOR_2::@XOR_2::@compute(%132, %133) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %121[@comp] = %134 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %135 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %136 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%135, %136] = %121 : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %125 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %127 = array.read %array_5[%125, %126] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %128 = pod.read %127[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %129 = struct.readm %128[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %130 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%130] = %129 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %131 = felt.add %92, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + scf.yield %55, %42, %29, %68 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %25 = felt.umod %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = bool.cmp eq(%25, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27:4 = scf.if %26 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %18[%85] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %array_2[%87, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %89 = pod.read %88[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %89[%90] = %86 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %92 = array.read %array_2[%91, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %92[@in] = %89 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%93, %c0] = %92 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %95 = array.read %array_1[%94, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %96 = pod.read %95[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.subi %96, %c1 {product_source = "compute"} : index + pod.write %95[@count] = %97 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %98 = arith.cmpi eq, %97, %c0 {product_source = "compute"} : index + scf.if %98 { + %99 = pod.read %92[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %100 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%99) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %95[@comp] = %100 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %101 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%101, %c0] = %95 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_1[%28, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %30 = pod.read %29[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %31 = struct.readm %30[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @emulated_aesenc_rijndael_sbox_0(%31) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_4[%33, %c0] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %34[@in] = %32 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%35, %c0] = %34 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_3[%36, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %83 = pod.read %34[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %84 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%83) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %37[@comp] = %84 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %85 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%85, %c0] = %37 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = felt.add %84, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %18[%86] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_2[%88, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %90 = pod.read %89[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %90[%91] = %87 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %93 = array.read %array_2[%92, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %93[@in] = %90 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%94, %c1] = %93 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %95 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %array_1[%95, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %97 = pod.read %96[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %98 = arith.subi %97, %c1 {product_source = "compute"} : index + pod.write %96[@count] = %98 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %99 = arith.cmpi eq, %98, %c0 {product_source = "compute"} : index + scf.if %99 { + %100 = pod.read %93[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %101 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%100) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %96[@comp] = %101 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %102 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%102, %c1] = %96 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %41 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_1[%41, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %45 = function.call @emulated_aesenc_rijndael_sbox_0(%44) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_4[%46, %c1] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %47[@in] = %45 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%48, %c1] = %47 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %49 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_3[%49, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %83 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %84 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%83) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %50[@comp] = %84 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %85 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%85, %c1] = %50 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = felt.add %84, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %18[%86] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_2[%88, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %90 = pod.read %89[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %90[%91] = %87 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %93 = array.read %array_2[%92, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %93[@in] = %90 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%94, %c2] = %93 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %95 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %array_1[%95, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %97 = pod.read %96[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %98 = arith.subi %97, %c1 {product_source = "compute"} : index + pod.write %96[@count] = %98 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %99 = arith.cmpi eq, %98, %c0 {product_source = "compute"} : index + scf.if %99 { + %100 = pod.read %93[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %101 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%100) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %96[@comp] = %101 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %102 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%102, %c2] = %96 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %54 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_1[%54, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %57 = struct.readm %56[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @emulated_aesenc_rijndael_sbox_0(%57) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array_4[%59, %c2] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %60[@in] = %58 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%61, %c2] = %60 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %62 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_3[%62, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %64 = pod.read %63[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %63[@count] = %65 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %83 = pod.read %60[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %84 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%83) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %63[@comp] = %84 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %85 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%85, %c2] = %63 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = felt.add %84, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %18[%86] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_2[%88, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %90 = pod.read %89[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %90[%91] = %87 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %93 = array.read %array_2[%92, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %93[@in] = %90 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %94 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%94, %c3] = %93 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %95 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %array_1[%95, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %97 = pod.read %96[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %98 = arith.subi %97, %c1 {product_source = "compute"} : index + pod.write %96[@count] = %98 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %99 = arith.cmpi eq, %98, %c0 {product_source = "compute"} : index + scf.if %99 { + %100 = pod.read %93[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %101 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%100) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %96[@comp] = %101 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %102 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%102, %c3] = %96 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %67 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %array_1[%67, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %69 = pod.read %68[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %70 = struct.readm %69[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %71 = function.call @emulated_aesenc_rijndael_sbox_0(%70) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_4[%72, %c3] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %73[@in] = %71 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%74, %c3] = %73 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %75 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_3[%75, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %77 = pod.read %76[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.subi %77, %c1 {product_source = "compute"} : index + pod.write %76[@count] = %78 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %79 = arith.cmpi eq, %78, %c0 {product_source = "compute"} : index + scf.if %79 { + %83 = pod.read %73[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %84 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%83) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %76[@comp] = %84 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %85 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%85, %c3] = %76 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_3[%84, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %87 = struct.readm %86[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %87[%89] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%91] = %90 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_3[%84, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %87 = struct.readm %86[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %87[%89] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = felt.add %83, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %91 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%92] = %90 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_3[%84, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %87 = struct.readm %86[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %87[%89] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = felt.add %83, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %92 = cast.toindex %91 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%92] = %90 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %80 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %81 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %82 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %80 to %81 step %82 { + %83 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %84 = bool.cmp lt(%83, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_3[%85, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %87 = pod.read %86[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %88 = struct.readm %87[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %89 = felt.sub %felt_const_7, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %89 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %88[%90] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = felt.add %83, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%93] = %91 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %94 = felt.add %83, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + scf.yield %58, %45, %71, %32 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + scf.yield %arg5, %arg4, %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %27#0, %27#1, %27#3, %27#2 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %22 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %23 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %24 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %22 to %23 step %24 { + %25 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %26 = bool.cmp lt(%25, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.sub %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet_8[%28, %29] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%31, %32] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %33[@a] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34, %35] = %33 : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array[%36, %37] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %63 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = function.call @XOR_2::@XOR_2::@compute(%63, %64) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %38[@comp] = %65 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %66 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%66, %67] = %38 : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %18[%42] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %array_0[%44, %45] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %46[@b] = %43 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%47, %48] = %46 : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %49 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array[%49, %50] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %63 = pod.read %46[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %46[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = function.call @XOR_2::@XOR_2::@compute(%63, %64) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %51[@comp] = %65 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %66 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%66, %67] = %51 : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %55 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array[%55, %56] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %58 = pod.read %57[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%60, %61] = %59 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %25, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + scf.yield %21#2, %21#3, %21#1, %21#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %17 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %18 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %16 to %17 step %18 { + %19 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %20 = bool.cmp lt(%19, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %nondet_8[%21, %22] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.mul %15, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%26] = %23 : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@bits2num_1$inputs] = %array_2 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_12 = array.new : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + %15 = array.read %array_1[%arg1, %arg2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + array.write %array_12[%arg1, %arg2] = %16 : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@bits2num_1] = %array_12 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_1$inputs] = %array_4 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_13 = array.new : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + %15 = array.read %array_3[%arg1, %arg2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_13[%arg1, %arg2] = %16 : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@num2bits_1] = %array_13 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@xor_2$inputs] = %array_6 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_14 = array.new : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c8 step %c1 { + %15 = array.read %array_5[%arg1, %arg2] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + array.write %array_14[%arg1, %arg2] = %16 : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_2] = %array_14 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_0 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_15 = array.new : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c32 step %c1 { + %15 = array.read %array[%arg1, %arg2] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + array.write %array_15[%arg1, %arg2] = %16 : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_15 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + struct.writem %self[@w] = %nondet : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@w] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<1920 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@xor_1] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@xor_1$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %6 = struct.readm %self[@bits2num_1] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> {product_source = "constrain"} + %7 = struct.readm %self[@bits2num_1$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %8 = struct.readm %self[@num2bits_1] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %9 = struct.readm %self[@num2bits_1$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %10 = struct.readm %self[@xor_2] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "constrain"} + %11 = struct.readm %self[@xor_2$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet_16 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_16[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c0] = %felt_const_1 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c1] = %felt_const_2 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c2] = %felt_const_4 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c3] = %felt_const_8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c4] = %felt_const_16 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c5] = %felt_const_32 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c6] = %felt_const_64 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c7] = %felt_const_128 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c8] = %felt_const_27 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c9] = %felt_const_54 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_17 = llzk.nondet : !array.type<60,32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_18 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_18[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_17[%c0] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c1] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c2] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c3] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c4] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c5] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c6] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c7] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c8] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c9] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c10] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c11] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c12] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c13] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c14] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c15] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c16] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c17] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c18] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c19] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c20] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c21] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c22] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c23] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c24] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c25] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c26] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c27] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c28] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c29] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c30] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c31] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c32] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c33] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c34] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c35] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c36] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c37] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c38] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c39] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c40] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c41] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c42] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c43] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c44] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c45] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c46] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c47] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c48] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c49] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c50] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c51] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c52] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c53] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c54] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c55] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c56] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c57] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c58] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c59] = %nondet_18 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_19 = llzk.nondet : !array.type<32,8 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_20 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_20[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_20[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_19[%c0] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c1] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c2] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c3] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c4] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c5] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c6] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c7] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c8] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c9] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c10] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c11] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c12] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c13] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c14] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c15] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c16] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c17] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c18] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c19] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c20] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c21] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c22] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c23] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c24] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c25] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c26] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c27] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c28] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c29] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c30] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_19[%c31] = %nondet_20 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %17 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %18 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %16 to %17 step %18 { + %19 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %20 = bool.cmp lt(%19, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%23] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_19[%25, %26] = %24 : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + %12:2 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %15 = bool.cmp lt(%arg2, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%15) %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">): + %15 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %16 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %17 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %18 = scf.for %arg3 = %15 to %16 step %17 iter_args(%arg4 = %arg1) -> (!felt.type<"babybear">) { + %20 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %21 = bool.cmp lt(%20, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %24 = bool.cmp lt(%arg5, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%24) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %24 = felt.mul %arg2, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %24, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %nondet_19[%26, %27] : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.mul %20, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %30, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_17[%29, %32] = %28 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %33 : !felt.type<"babybear"> + } + %23 = felt.add %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %22 : !felt.type<"babybear"> + } + %19 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %13 = cast.toindex %12#1 : !felt.type<"babybear"> {product_source = "constrain"} + %14:4 = scf.for %arg1 = %13 to %c60 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_21 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_21[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_21[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.extract %nondet_17[%17] : <60,32 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = felt.umod %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = bool.cmp eq(%19, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21:4 = scf.if %20 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %18[%53] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %7[%55, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %57 = pod.read %56[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %57[%58] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %25 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %6[%25, %c0] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %27 = struct.readm %26[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = function.call @emulated_aesenc_rijndael_sbox_0(%27) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %18[%54] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %7[%56, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %29 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %6[%29, %c1] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %31 = struct.readm %30[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = function.call @emulated_aesenc_rijndael_sbox_0(%31) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %18[%54] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %7[%56, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %33 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %6[%33, %c2] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %35 = struct.readm %34[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = function.call @emulated_aesenc_rijndael_sbox_0(%35) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %18[%54] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %7[%56, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = pod.read %57[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %37 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %6[%37, %c3] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %39 = struct.readm %38[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = function.call @emulated_aesenc_rijndael_sbox_0(%39) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %8[%52, %c0] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %54 = struct.readm %53[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %54[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %51, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%59] = %57 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %8[%52, %c1] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %54 = struct.readm %53[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %54[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%58] = %57 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %8[%52, %c2] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %54 = struct.readm %53[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %54[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %51, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%59] = %57 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %8[%52, %c3] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %54 = struct.readm %53[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %54[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %51, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%59] = %57 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %41 = felt.div %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %41, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %nondet_16[%43] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %9[%45, %c4] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %47 = pod.read %46[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %49 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %50 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %48 to %49 step %50 { + %51 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %52 = bool.cmp lt(%51, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %18[%53] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %11[%55, %56] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %58 = pod.read %57[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %58, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %8[%59, %c4] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %61 = struct.readm %60[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = felt.sub %felt_const_7, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %61[%63] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %11[%65, %66] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %68 = pod.read %67[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %10[%69, %70] : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%73] = %72 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %51, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + scf.yield %36, %40, %32, %28 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %25 = felt.umod %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%25, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27:4 = scf.if %26 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %18[%49] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %7[%51, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %53 = pod.read %52[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %54 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %53[%54] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %6[%28, %c0] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = function.call @emulated_aesenc_rijndael_sbox_0(%30) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.add %48, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %18[%50] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %7[%52, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = pod.read %53[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %54[%55] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %32 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %6[%32, %c1] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %34 = struct.readm %33[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = function.call @emulated_aesenc_rijndael_sbox_0(%34) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.add %48, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %18[%50] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %7[%52, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = pod.read %53[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %54[%55] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %6[%36, %c2] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %38 = struct.readm %37[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = function.call @emulated_aesenc_rijndael_sbox_0(%38) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.add %48, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %18[%50] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %7[%52, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = pod.read %53[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %54[%55] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %40 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %6[%40, %c3] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %42 = struct.readm %41[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = function.call @emulated_aesenc_rijndael_sbox_0(%42) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %8[%48, %c0] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %50 = struct.readm %49[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %50[%52] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%54] = %53 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %8[%48, %c1] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %50 = struct.readm %49[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %50[%52] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %47, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%55] = %53 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %8[%48, %c2] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %50 = struct.readm %49[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %50[%52] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %47, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%55] = %53 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %45 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %46 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %44 to %45 step %46 { + %47 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %48 = bool.cmp lt(%47, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %8[%49, %c3] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %51[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %47, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %18[%56] = %54 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.add %47, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + scf.yield %43, %39, %35, %31 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + scf.yield %arg5, %arg2, %arg4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %27#1, %27#0, %27#2, %27#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %22 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %23 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %24 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %22 to %23 step %24 { + %25 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %26 = bool.cmp lt(%25, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.sub %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %nondet_17[%28, %29] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %5[%31, %32] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %18[%35] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %5[%37, %38] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %4[%41, %42] : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %44 = struct.readm %43[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_17[%45, %46] = %44 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %25, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + scf.yield %21#0, %21#3, %21#2, %21#1 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c60 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %17 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %18 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %16 to %17 step %18 { + %19 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %20 = bool.cmp lt(%19, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %nondet_17[%21, %22] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.mul %15, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %24, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + %15 = array.read %6[%arg1, %arg2] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %16 = array.read %7[%arg1, %arg2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_0::@Bits2Num_0::@constrain(%15, %17) : (!struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + %15 = array.read %8[%arg1, %arg2] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %16 = array.read %9[%arg1, %arg2] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%15, %17) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c8 step %c1 { + %15 = array.read %10[%arg1, %arg2] : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %16 = array.read %11[%arg1, %arg2] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_2::@XOR_2::@constrain(%15, %17, %18) : (!struct.type<@XOR_2::@XOR_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c32 step %c1 { + %15 = array.read %4[%arg1, %arg2] : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %16 = array.read %5[%arg1, %arg2] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_2::@XOR_2::@constrain(%15, %17, %18) : (!struct.type<@XOR_2::@XOR_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>> + } + function.def @compute(%arg0: !array.type<256 x !felt.type<"babybear">>) -> !struct.type<@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %felt_const_24 = felt.const 24 : <"babybear"> {product_source = "compute"} + %felt_const_54 = felt.const 54 : <"babybear"> {product_source = "compute"} + %felt_const_27 = felt.const 27 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "compute"} + %felt_const_16 = felt.const 16 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c5 = arith.constant {product_source = "compute"} 5 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c60 = arith.constant {product_source = "compute"} 60 : index + %self = struct.new : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c32 step %c1 { + %3 = array.read %array[%arg1, %arg2] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2] = %3 : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = array.read %array_1[%arg1, %arg2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c8 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg1, %arg2] = %3 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = array.read %array_3[%arg1, %arg2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg1, %arg2] = %3 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c8 step %c1 { + %3 = array.read %array_5[%arg1, %arg2] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg1, %arg2] = %3 : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_1 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_2 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_4 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_16 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_32 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_64 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_128 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_27 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_54 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_8 = llzk.nondet : !array.type<60,32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_9[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_9[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_8[%c0] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c1] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c2] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c3] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c4] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c5] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c6] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c7] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c8] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c9] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c10] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c11] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c12] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c13] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c14] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c15] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c16] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c17] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c18] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c19] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c20] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c21] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c22] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c23] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c24] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c25] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c26] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c27] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c28] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c29] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c30] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c31] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c32] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c33] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c34] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c35] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c36] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c37] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c38] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c39] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c40] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c41] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c42] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c43] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c44] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c45] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c46] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c47] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c48] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c49] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c50] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c51] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c52] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c53] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c54] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c55] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c56] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c57] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c58] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_8[%c59] = %nondet_9 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<32,8 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_11 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_11[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_10[%c0] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c1] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c2] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c3] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c4] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c5] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c6] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c7] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c8] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c9] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c10] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c11] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c12] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c13] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c14] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c15] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c16] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c17] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c18] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c19] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c20] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c21] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c22] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c23] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c24] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c25] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c26] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c27] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c28] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c29] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c30] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_10[%c31] = %nondet_11 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %5 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %6 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %4 to %5 step %6 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %8 = bool.cmp lt(%7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%13, %14] = %12 : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + %0:2 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %3 = bool.cmp lt(%arg1, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%3) %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">): + %3 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %5 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %6 = scf.for %arg3 = %3 to %4 step %5 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = bool.cmp lt(%8, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %12 = bool.cmp lt(%arg5, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%12) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %12 = felt.mul %arg1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet_10[%14, %15] : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %arg1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.mul %8, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %18, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%17, %20] = %16 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %21 : !felt.type<"babybear"> + } + %11 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %10 : !felt.type<"babybear"> + } + %7 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %1 = cast.toindex %0#0 : !felt.type<"babybear"> {product_source = "compute"} + %2:4 = scf.for %arg1 = %1 to %c60 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %nondet_16 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_16[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_16[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.extract %nondet_8[%5] : <60,32 x !felt.type<"babybear">> {product_source = "compute"} + %7 = felt.umod %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = bool.cmp eq(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9:4 = scf.if %8 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %6[%82] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_2[%84, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %86 = pod.read %85[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %87 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %86[%87] = %83 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_2[%88, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %89[@in] = %86 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%90, %c0] = %89 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %91 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %92 = array.read %array_1[%91, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %93 = pod.read %92[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %94 = arith.subi %93, %c1 {product_source = "compute"} : index + pod.write %92[@count] = %94 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.cmpi eq, %94, %c0 {product_source = "compute"} : index + scf.if %95 { + %96 = pod.read %89[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %97 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%96) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %92[@comp] = %97 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %98 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%98, %c0] = %92 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_1[%13, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %17 = function.call @emulated_aesenc_rijndael_sbox_0(%16) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_4[%18, %c0] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@in] = %17 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%20, %c0] = %19 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %21 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %80 = pod.read %19[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%80) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %22[@comp] = %81 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%82, %c0] = %22 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = felt.add %81, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %82 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %6[%83] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_2[%85, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %87 = pod.read %86[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %87[%88] = %84 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %array_2[%89, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %90[@in] = %87 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%91, %c1] = %90 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %92 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %93 = array.read %array_1[%92, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %94 = pod.read %93[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %93[@count] = %95 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %97 = pod.read %90[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %98 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%97) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %93[@comp] = %98 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %99 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%99, %c1] = %93 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array_1[%26, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %28 = pod.read %27[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %30 = function.call @emulated_aesenc_rijndael_sbox_0(%29) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_4[%31, %c1] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@in] = %30 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%33, %c1] = %32 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%34, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %80 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%80) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %35[@comp] = %81 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%82, %c1] = %35 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = felt.add %81, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %82 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %6[%83] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_2[%85, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %87 = pod.read %86[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %87[%88] = %84 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %array_2[%89, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %90[@in] = %87 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%91, %c2] = %90 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %92 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %93 = array.read %array_1[%92, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %94 = pod.read %93[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %93[@count] = %95 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %97 = pod.read %90[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %98 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%97) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %93[@comp] = %98 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %99 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%99, %c2] = %93 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_1[%39, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %42 = struct.readm %41[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %43 = function.call @emulated_aesenc_rijndael_sbox_0(%42) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %array_4[%44, %c2] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %45[@in] = %43 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%46, %c2] = %45 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %47 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_3[%47, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %80 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%80) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %48[@comp] = %81 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%82, %c2] = %48 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = felt.add %81, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %82 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %6[%83] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_2[%85, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %87 = pod.read %86[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %87[%88] = %84 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %90 = array.read %array_2[%89, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %90[@in] = %87 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%91, %c3] = %90 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %92 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %93 = array.read %array_1[%92, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %94 = pod.read %93[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %93[@count] = %95 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %97 = pod.read %90[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %98 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%97) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %93[@comp] = %98 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %99 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%99, %c3] = %93 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %52 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_1[%52, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %55 = struct.readm %54[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @emulated_aesenc_rijndael_sbox_0(%55) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %array_4[%57, %c3] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %58[@in] = %56 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%59, %c3] = %58 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %60 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_3[%60, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %80 = pod.read %58[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%80) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %61[@comp] = %81 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%82, %c3] = %61 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_3[%81, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %84 = struct.readm %83[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %85 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %84[%86] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = felt.add %80, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%89] = %87 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_3[%81, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %84 = struct.readm %83[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %85 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %84[%86] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%88] = %87 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_3[%81, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %84 = struct.readm %83[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %85 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %84[%86] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = felt.add %80, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%89] = %87 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_3[%81, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %84 = struct.readm %83[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %85 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %85 : !felt.type<"babybear"> {product_source = "compute"} + %87 = array.read %84[%86] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = felt.add %80, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %89 = cast.toindex %88 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%89] = %87 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %65 = felt.div %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66 = felt.sub %65, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %nondet_7[%67] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %array_4[%69, %c4] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %70[@in] = %68 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%71, %c4] = %70 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %72 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_3[%72, %c4] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.subi %74, %c1 {product_source = "compute"} : index + pod.write %73[@count] = %75 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.cmpi eq, %75, %c0 {product_source = "compute"} : index + scf.if %76 { + %80 = pod.read %70[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%80) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %73[@comp] = %81 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%82, %c4] = %73 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %77 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %78 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %79 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %77 to %78 step %79 { + %80 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %81 = bool.cmp lt(%80, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %6[%82] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_6[%84, %85] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %86[@a] = %83 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%87, %88] = %86 : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %89 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %array_5[%89, %90] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %92 = pod.read %91[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.subi %92, %c1 {product_source = "compute"} : index + pod.write %91[@count] = %93 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %94 = arith.cmpi eq, %93, %c0 {product_source = "compute"} : index + scf.if %94 { + %120 = pod.read %86[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %121 = pod.read %86[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %122 = function.call @XOR_2::@XOR_2::@compute(%120, %121) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %91[@comp] = %122 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %123 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %124 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%123, %124] = %91 : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %95 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %96 = array.read %array_3[%95, %c4] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %97 = pod.read %96[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %99 = felt.sub %felt_const_7, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %99 : !felt.type<"babybear"> {product_source = "compute"} + %101 = array.read %98[%100] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %103 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %104 = array.read %array_6[%102, %103] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %104[@b] = %101 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %105 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%105, %106] = %104 : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %107 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %108 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %109 = array.read %array_5[%107, %108] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %110 = pod.read %109[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %111 = arith.subi %110, %c1 {product_source = "compute"} : index + pod.write %109[@count] = %111 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %112 = arith.cmpi eq, %111, %c0 {product_source = "compute"} : index + scf.if %112 { + %120 = pod.read %104[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %121 = pod.read %104[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %122 = function.call @XOR_2::@XOR_2::@compute(%120, %121) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %109[@comp] = %122 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %123 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %124 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%123, %124] = %109 : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %113 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %114 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + %115 = array.read %array_5[%113, %114] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %116 = pod.read %115[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %117 = struct.readm %116[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %118 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%118] = %117 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %119 = felt.add %80, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + scf.yield %43, %30, %17, %56 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %13 = felt.umod %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = bool.cmp eq(%13, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15:4 = scf.if %14 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %6[%73] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_2[%75, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %77 = pod.read %76[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %78 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %77[%78] = %74 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %array_2[%79, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %80[@in] = %77 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %81 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%81, %c0] = %80 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %array_1[%82, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %84 = pod.read %83[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.subi %84, %c1 {product_source = "compute"} : index + pod.write %83[@count] = %85 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.cmpi eq, %85, %c0 {product_source = "compute"} : index + scf.if %86 { + %87 = pod.read %80[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%87) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %83[@comp] = %88 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %89 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%89, %c0] = %83 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_1[%16, %c0] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %18 = pod.read %17[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %20 = function.call @emulated_aesenc_rijndael_sbox_0(%19) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_4[%21, %c0] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%23, %c0] = %22 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %24 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_3[%24, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %71 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%71) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %25[@comp] = %72 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %73 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%73, %c0] = %25 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = felt.add %72, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %6[%74] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %array_2[%76, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %78 = pod.read %77[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79] = %75 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_2[%80, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %81[@in] = %78 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%82, %c1] = %81 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %83 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array_1[%83, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.subi %85, %c1 {product_source = "compute"} : index + pod.write %84[@count] = %86 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.cmpi eq, %86, %c0 {product_source = "compute"} : index + scf.if %87 { + %88 = pod.read %81[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %89 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%88) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %84[@comp] = %89 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %90 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%90, %c1] = %84 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_1[%29, %c1] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @emulated_aesenc_rijndael_sbox_0(%32) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_4[%34, %c1] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@in] = %33 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%36, %c1] = %35 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %37 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_3[%37, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %71 = pod.read %35[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%71) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %38[@comp] = %72 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %73 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%73, %c1] = %38 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = felt.add %72, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %6[%74] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %array_2[%76, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %78 = pod.read %77[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79] = %75 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_2[%80, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %81[@in] = %78 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%82, %c2] = %81 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %83 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array_1[%83, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.subi %85, %c1 {product_source = "compute"} : index + pod.write %84[@count] = %86 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.cmpi eq, %86, %c0 {product_source = "compute"} : index + scf.if %87 { + %88 = pod.read %81[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %89 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%88) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %84[@comp] = %89 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %90 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%90, %c2] = %84 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_1[%42, %c2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @emulated_aesenc_rijndael_sbox_0(%45) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_4[%47, %c2] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@in] = %46 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%49, %c2] = %48 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %50 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_3[%50, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %71 = pod.read %48[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%71) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %51[@comp] = %72 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %73 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%73, %c2] = %51 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = felt.add %72, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %6[%74] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %array_2[%76, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %78 = pod.read %77[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79] = %75 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_2[%80, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %81[@in] = %78 : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%82, %c3] = %81 : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %83 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array_1[%83, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.subi %85, %c1 {product_source = "compute"} : index + pod.write %84[@count] = %86 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.cmpi eq, %86, %c0 {product_source = "compute"} : index + scf.if %87 { + %88 = pod.read %81[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %89 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%88) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %84[@comp] = %89 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %90 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%90, %c3] = %84 : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %55 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %array_1[%55, %c3] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %57 = pod.read %56[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %58 = struct.readm %57[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @emulated_aesenc_rijndael_sbox_0(%58) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_4[%60, %c3] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@in] = %59 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%62, %c3] = %61 : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %63 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %array_3[%63, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %64[@count] = %66 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %71 = pod.read %61[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%71) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %64[@comp] = %72 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %73 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%73, %c3] = %64 : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_3[%72, %c0] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %75 = struct.readm %74[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %76 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %77 = cast.toindex %76 : !felt.type<"babybear"> {product_source = "compute"} + %78 = array.read %75[%77] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%79] = %78 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_3[%72, %c1] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %75 = struct.readm %74[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %76 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %77 = cast.toindex %76 : !felt.type<"babybear"> {product_source = "compute"} + %78 = array.read %75[%77] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = felt.add %71, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%80] = %78 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c8 step %c1 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_3[%72, %c2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %75 = struct.readm %74[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %76 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %77 = cast.toindex %76 : !felt.type<"babybear"> {product_source = "compute"} + %78 = array.read %75[%77] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = felt.add %71, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%80] = %78 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %68 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %69 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %70 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %68 to %69 step %70 { + %71 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %72 = bool.cmp lt(%71, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_3[%73, %c3] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %75 = pod.read %74[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %76 = struct.readm %75[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %77 = felt.sub %felt_const_7, %71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + %79 = array.read %76[%78] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %80 = felt.add %71, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%81] = %79 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = felt.add %71, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + scf.yield %46, %33, %59, %20 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + scf.yield %arg5, %arg4, %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %15#0, %15#1, %15#3, %15#2 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %11 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %12 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg6 = %10 to %11 step %12 { + %13 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %14 = bool.cmp lt(%13, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.sub %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %nondet_8[%16, %17] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_0[%19, %20] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %21[@a] = %18 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%22, %23] = %21 : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %24 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array[%24, %25] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %51 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %21[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %53 = function.call @XOR_2::@XOR_2::@compute(%51, %52) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %26[@comp] = %53 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %54 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%54, %55] = %26 : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %30 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %6[%30] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_0[%32, %33] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %34[@b] = %31 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%35, %36] = %34 : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %37 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%37, %38] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %51 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %34[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %53 = function.call @XOR_2::@XOR_2::@compute(%51, %52) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + pod.write %39[@comp] = %53 : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %54 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%54, %55] = %39 : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %43 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %array[%43, %44] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %46 = pod.read %45[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + %47 = struct.readm %46[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%48, %49] = %47 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + scf.yield %9#2, %9#3, %9#1, %9#0 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %5 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %6 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %4 to %5 step %6 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %8 = bool.cmp lt(%7, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %nondet_8[%9, %10] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %3, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %11 : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@bits2num_1$inputs] = %array_2 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_12 = array.new : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = array.read %array_1[%arg1, %arg2] : <60,4 x !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + array.write %array_12[%arg1, %arg2] = %4 : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@bits2num_1] = %array_12 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> {product_source = "compute"} + struct.writem %self[@num2bits_1$inputs] = %array_4 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_13 = array.new : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = array.read %array_3[%arg1, %arg2] : <60,5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_13[%arg1, %arg2] = %4 : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@num2bits_1] = %array_13 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@xor_2$inputs] = %array_6 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_14 = array.new : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c8 step %c1 { + %3 = array.read %array_5[%arg1, %arg2] : <60,8 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + array.write %array_14[%arg1, %arg2] = %4 : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_2] = %array_14 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_0 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_15 = array.new : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c60 step %c1 { + scf.for %arg2 = %c0 to %c32 step %c1 { + %3 = array.read %array[%arg1, %arg2] : <60,32 x !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@XOR_2::@XOR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + array.write %array_15[%arg1, %arg2] = %4 : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_15 : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "compute"} + struct.writem %self[@w] = %nondet : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<1920 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, %arg1: !array.type<256 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c32 = arith.constant {product_source = "constrain"} 32 : index + %c8 = arith.constant {product_source = "constrain"} 8 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c60 = arith.constant {product_source = "constrain"} 60 : index + %felt_const_24 = felt.const 24 : <"babybear"> {product_source = "constrain"} + %felt_const_54 = felt.const 54 : <"babybear"> {product_source = "constrain"} + %felt_const_27 = felt.const 27 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_32 = felt.const 32 : <"babybear"> {product_source = "constrain"} + %felt_const_16 = felt.const 16 : <"babybear"> {product_source = "constrain"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "constrain"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@w] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<1920 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@xor_1] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@xor_1$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@bits2num_1] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@bits2num_1$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@num2bits_1] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@num2bits_1$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@xor_2] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !struct.type<@XOR_2::@XOR_2<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@xor_2$inputs] : <@AES256KeyExpansion_3::@AES256KeyExpansion_3<[]>>, !array.type<60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_1 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_2 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_4 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_16 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_32 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_64 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_128 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_27 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_54 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<60,32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_0[%c0] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c1] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c2] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c3] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c4] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c5] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c6] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c7] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c8] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c9] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c10] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c11] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c12] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c13] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c14] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c15] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c16] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c17] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c18] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c19] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c20] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c21] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c22] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c23] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c24] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c25] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c26] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c27] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c28] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c29] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c30] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c31] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c32] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c33] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c34] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c35] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c36] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c37] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c38] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c39] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c40] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c41] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c42] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c43] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c44] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c45] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c46] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c47] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c48] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c49] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c50] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c51] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c52] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c53] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c54] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c55] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c56] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c57] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c58] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_0[%c59] = %nondet_1 : <60,32 x !felt.type<"babybear">>, <32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<32,8 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_3 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_3[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_2[%c0] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c1] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c2] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c3] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c4] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c5] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c6] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c7] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c8] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c9] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c10] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c11] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c12] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c13] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c14] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c15] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c16] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c17] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c18] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c19] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c20] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c21] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c22] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c23] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c24] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c25] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c26] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c27] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c28] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c29] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c30] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_2[%c31] = %nondet_3 : <32,8 x !felt.type<"babybear">>, <8 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %14 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %15 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %13 to %14 step %15 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %17 = bool.cmp lt(%16, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%20] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%22, %23] = %21 : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.add %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + %9:2 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %12 = bool.cmp lt(%arg3, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%12) %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">): + %12 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %13 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %14 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %15 = scf.for %arg4 = %12 to %13 step %14 iter_args(%arg5 = %arg2) -> (!felt.type<"babybear">) { + %17 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %18 = bool.cmp lt(%17, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %21 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%21) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %21 = felt.mul %arg3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %nondet_2[%23, %24] : <32,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.mul %17, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.add %27, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%26, %29] = %25 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %30 : !felt.type<"babybear"> + } + %20 = felt.add %17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %19 : !felt.type<"babybear"> + } + %16 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = cast.toindex %9#1 : !felt.type<"babybear"> {product_source = "constrain"} + %11:4 = scf.for %arg2 = %10 to %c60 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_0, %arg6 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_4 = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_4[%c0] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c1] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c2] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c3] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c4] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c5] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c6] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c7] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c8] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c9] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c10] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c11] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c12] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c13] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c14] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c15] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c16] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c17] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c18] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c19] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c20] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c21] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c22] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c23] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c24] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c25] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c26] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c27] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c28] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c29] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c30] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c31] = %felt_const_0 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.extract %nondet_0[%14] : <60,32 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = felt.umod %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = bool.cmp eq(%16, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18:4 = scf.if %17 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %15[%50] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %4[%52, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = pod.read %53[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %54[%55] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %3[%22, %c0] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = function.call @emulated_aesenc_rijndael_sbox_0(%24) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %15[%51] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %4[%53, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = pod.read %54[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %55[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %26 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26, %c1] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = function.call @emulated_aesenc_rijndael_sbox_0(%28) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %15[%51] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %4[%53, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = pod.read %54[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %55[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %3[%30, %c2] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %32 = struct.readm %31[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = function.call @emulated_aesenc_rijndael_sbox_0(%32) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %15[%51] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %4[%53, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = pod.read %54[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %55[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %34 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %3[%34, %c3] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %36 = struct.readm %35[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = function.call @emulated_aesenc_rijndael_sbox_0(%36) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %5[%49, %c0] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %51[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %48, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%56] = %54 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %5[%49, %c1] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %51[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%55] = %54 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %5[%49, %c2] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %51[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %48, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%56] = %54 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %5[%49, %c3] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %51[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %48, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%56] = %54 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %38 = felt.div %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %38, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %nondet[%40] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %6[%42, %c4] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %46 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %47 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg7 = %45 to %46 step %47 { + %48 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %49 = bool.cmp lt(%48, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %15[%50] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %8[%52, %53] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %55 = pod.read %54[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %5[%56, %c4] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %58 = struct.readm %57[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = felt.sub %felt_const_7, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %58[%60] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %8[%62, %63] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %65 = pod.read %64[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %7[%66, %67] : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %69 = struct.readm %68[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%70] = %69 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %48, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + scf.yield %33, %37, %29, %25 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %22 = felt.umod %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = bool.cmp eq(%22, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24:4 = scf.if %23 -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %15[%46] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %4[%48, %c0] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = pod.read %49[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %25 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %3[%25, %c0] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %27 = struct.readm %26[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = function.call @emulated_aesenc_rijndael_sbox_0(%27) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %15[%47] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %4[%49, %c1] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = pod.read %50[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %51[%52] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %3[%29, %c1] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %31 = struct.readm %30[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = function.call @emulated_aesenc_rijndael_sbox_0(%31) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %15[%47] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %4[%49, %c2] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = pod.read %50[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %51[%52] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %33 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %3[%33, %c2] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %35 = struct.readm %34[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = function.call @emulated_aesenc_rijndael_sbox_0(%35) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %15[%47] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %4[%49, %c3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = pod.read %50[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %51[%52] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %37 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %3[%37, %c3] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %39 = struct.readm %38[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = function.call @emulated_aesenc_rijndael_sbox_0(%39) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45, %c0] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %47[%49] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%51] = %50 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45, %c1] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %47[%49] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %44, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%52] = %50 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45, %c2] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %47[%49] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %44, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%52] = %50 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %41 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %42 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %43 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg7 = %41 to %42 step %43 { + %44 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %45 = bool.cmp lt(%44, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %5[%46, %c3] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %48 = struct.readm %47[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = felt.sub %felt_const_7, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %48[%50] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.add %44, %felt_const_24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %15[%53] = %51 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %44, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + scf.yield %40, %36, %32, %28 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } else { + scf.yield %arg6, %arg3, %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %24#1, %24#0, %24#2, %24#3 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %19 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %20 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %21 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg7 = %19 to %20 step %21 { + %22 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %23 = bool.cmp lt(%22, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.sub %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %nondet_0[%25, %26] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %2[%28, %29] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %31 = pod.read %30[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %15[%32] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %2[%34, %35] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %37 = pod.read %36[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %1[%38, %39] : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %41 = struct.readm %40[@out] : <@XOR_2::@XOR_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%42, %43] = %41 : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + scf.yield %18#0, %18#3, %18#2, %18#1 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c60 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %14 = cast.toindex %felt_const_32 : !felt.type<"babybear"> + %15 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %13 to %14 step %15 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %17 = bool.cmp lt(%16, %felt_const_32) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %nondet_0[%18, %19] : <60,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %12, %felt_const_32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %0[%23] : <1920 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c60 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %12 = array.read %3[%arg2, %arg3] : <60,4 x !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %13 = array.read %4[%arg2, %arg3] : <60,4 x !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_0::@Bits2Num_0::@constrain(%12, %14) : (!struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c60 step %c1 { + scf.for %arg3 = %c0 to %c5 step %c1 { + %12 = array.read %5[%arg2, %arg3] : <60,5 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %13 = array.read %6[%arg2, %arg3] : <60,5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%12, %14) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c60 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %12 = array.read %7[%arg2, %arg3] : <60,8 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %13 = array.read %8[%arg2, %arg3] : <60,8 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %14 = pod.read %13[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %13[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_2::@XOR_2::@constrain(%12, %14, %15) : (!struct.type<@XOR_2::@XOR_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c60 step %c1 { + scf.for %arg3 = %c0 to %c32 step %c1 { + %12 = array.read %1[%arg2, %arg3] : <60,32 x !struct.type<@XOR_2::@XOR_2<[]>>>, !struct.type<@XOR_2::@XOR_2<[]>> {product_source = "constrain"} + %13 = array.read %2[%arg2, %arg3] : <60,32 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %14 = pod.read %13[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %13[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_2::@XOR_2::@constrain(%12, %14, %15) : (!struct.type<@XOR_2::@XOR_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/aliascheck_test.llzk b/examples/circom-demo/aliascheck_test.llzk new file mode 100644 index 0000000..ee5ce97 --- /dev/null +++ b/examples/circom-demo/aliascheck_test.llzk @@ -0,0 +1,622 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@AliasCheck_2::@AliasCheck_2<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_1 { + struct.def @CompConstant_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg5, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg2, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %40, %39, %41, %38 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#3 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_0::@Num2Bits_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %20 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_340282366920938463463374607431768211455, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg4, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %39, %41, %38, %40 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%11, %17) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_1::@CompConstant_1<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg3, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg2, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg5, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg2, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %30, %29, %31, %28 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#3 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_1::@CompConstant_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_0, %arg6 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg3, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg6, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg5, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg6, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %31, %33, %30, %32 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %9) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AliasCheck_2 { + struct.def @AliasCheck_2 { + struct.member @compConstant : !struct.type<@CompConstant_1::@CompConstant_1<[]>> + struct.member @compConstant$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_2::@AliasCheck_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@AliasCheck_2::@AliasCheck_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@compConstant] : <@AliasCheck_2::@AliasCheck_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "constrain"} + %1 = struct.readm %self[@compConstant$inputs] : <@AliasCheck_2::@AliasCheck_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %8 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @CompConstant_1::@CompConstant_1::@product(%19) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> + %21 = function.call @CompConstant_1::@CompConstant_1::@compute(%19) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %1[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@compConstant$inputs] = %pod_0 : <@AliasCheck_2::@AliasCheck_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + struct.writem %self[@compConstant] = %2 : <@AliasCheck_2::@AliasCheck_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %3 = struct.readm %0[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %1[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_1::@CompConstant_1::@constrain(%0, %4) : (!struct.type<@CompConstant_1::@CompConstant_1<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@AliasCheck_2::@AliasCheck_2<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_2::@AliasCheck_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@AliasCheck_2::@AliasCheck_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %4[%5] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %4 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %9 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %10 = function.call @CompConstant_1::@CompConstant_1::@compute(%9) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@compConstant$inputs] = %pod_0 : <@AliasCheck_2::@AliasCheck_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + struct.writem %self[@compConstant] = %0 : <@AliasCheck_2::@AliasCheck_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AliasCheck_2::@AliasCheck_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@AliasCheck_2::@AliasCheck_2<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@compConstant] : <@AliasCheck_2::@AliasCheck_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "constrain"} + %1 = struct.readm %arg0[@compConstant$inputs] : <@AliasCheck_2::@AliasCheck_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %1[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %7[%8] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %2 = struct.readm %0[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = pod.read %1[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_1::@CompConstant_1::@constrain(%0, %3) : (!struct.type<@CompConstant_1::@CompConstant_1<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/babyadd_tester.llzk b/examples/circom-demo/babyadd_tester.llzk new file mode 100644 index 0000000..bdda4b8 --- /dev/null +++ b/examples/circom-demo/babyadd_tester.llzk @@ -0,0 +1,140 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BabyAdd_0::@BabyAdd_0<[]>>} { + poly.template @BabyAdd_0 { + struct.def @BabyAdd_0 { + struct.member @xout : !felt.type<"babybear"> {llzk.pub} + struct.member @yout : !felt.type<"babybear"> {llzk.pub} + struct.member @beta : !felt.type<"babybear"> + struct.member @gamma : !felt.type<"babybear"> + struct.member @delta : !felt.type<"babybear"> + struct.member @tau : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !struct.type<@BabyAdd_0::@BabyAdd_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808326917 : <"babybear"> {product_source = "compute"} + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "compute"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BabyAdd_0::@BabyAdd_0<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@beta] = %0 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@gamma] = %1 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.mul %arg0, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@delta] = %5 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@tau] = %6 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %6, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.div %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@xout] = %10 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %0, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %5, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %12, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %6, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.div %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@yout] = %16 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %17 = struct.readm %self[@xout] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %self[@yout] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = struct.readm %self[@beta] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %self[@gamma] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %self[@delta] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %self[@tau] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.mul %arg0, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.mul %arg0, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.add %25, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.mul %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.mul %22, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.mul %31, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = felt.mul %22, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.sub %felt_const_1, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %19, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %21, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %38, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@BabyAdd_0::@BabyAdd_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !struct.type<@BabyAdd_0::@BabyAdd_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808326917 : <"babybear"> {product_source = "compute"} + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "compute"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BabyAdd_0::@BabyAdd_0<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@beta] = %0 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@gamma] = %1 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.mul %arg0, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@delta] = %5 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@tau] = %6 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %6, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.div %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@xout] = %10 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %0, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %5, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %12, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %6, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.div %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@yout] = %16 : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BabyAdd_0::@BabyAdd_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BabyAdd_0::@BabyAdd_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">, %arg4: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808326917 : <"babybear"> {product_source = "constrain"} + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "constrain"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@xout] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@yout] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %arg0[@beta] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@gamma] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %arg0[@delta] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = struct.readm %arg0[@tau] : <@BabyAdd_0::@BabyAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.mul %arg1, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %arg1, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808326917 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %5, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %14, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %5, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %felt_const_1, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %2, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %21, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/babycheck_test.llzk b/examples/circom-demo/babycheck_test.llzk new file mode 100644 index 0000000..09dd1cb --- /dev/null +++ b/examples/circom-demo/babycheck_test.llzk @@ -0,0 +1,58 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BabyCheck_0::@BabyCheck_0<[]>>} { + poly.template @BabyCheck_0 { + struct.def @BabyCheck_0 { + struct.member @x2 : !felt.type<"babybear"> + struct.member @y2 : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@BabyCheck_0::@BabyCheck_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "compute"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BabyCheck_0::@BabyCheck_0<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@x2] = %0 : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@y2] = %1 : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %2 = struct.readm %self[@x2] : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@y2] : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.mul %2, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %6, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %2, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %8, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@BabyCheck_0::@BabyCheck_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@BabyCheck_0::@BabyCheck_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %self = struct.new : <@BabyCheck_0::@BabyCheck_0<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@x2] = %0 : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@y2] = %1 : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BabyCheck_0::@BabyCheck_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BabyCheck_0::@BabyCheck_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "constrain"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@x2] : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@y2] : <@BabyCheck_0::@BabyCheck_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %0, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.mul %0, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %6, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/binsub_test.llzk b/examples/circom-demo/binsub_test.llzk new file mode 100644 index 0000000..1e829c8 --- /dev/null +++ b/examples/circom-demo/binsub_test.llzk @@ -0,0 +1,645 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@A_3::@A_3<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BinSub_1 { + struct.def @BinSub_1 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @product(%arg0: !array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_65536 = felt.const 65536 : <"babybear"> {product_source = "compute"} + %felt_const_16 = felt.const 16 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_65536) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%c0, %13] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.pow %felt_const_2, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %arg2, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg0[%c1, %18] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.pow %felt_const_2, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.mul %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.sub %17, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %22 : !felt.type<"babybear"> + } {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.shr %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.bit_and %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet[%16] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.pow %felt_const_2, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %arg2, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %20 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.shr %0, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@aux] = %3 : <@BinSub_1::@BinSub_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@aux] : <@BinSub_1::@BinSub_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_65536) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%c0, %13] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.pow %felt_const_2, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %arg2, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c1, %18] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.pow %felt_const_2, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %17, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %22 : !felt.type<"babybear"> + } {product_source = "constrain"} + %7 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %4[%13] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %4[%15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %4[%19] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.pow %felt_const_2, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %23 : !felt.type<"babybear"> + } {product_source = "constrain"} + %8 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %5, %felt_const_65536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@BinSub_1::@BinSub_1<[]>> + } + function.def @compute(%arg0: !array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_65536 = felt.const 65536 : <"babybear"> {product_source = "compute"} + %felt_const_16 = felt.const 16 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_65536) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%c0, %5] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.pow %felt_const_2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%c1, %10] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.pow %felt_const_2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.sub %9, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %14 : !felt.type<"babybear"> + } {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.shr %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.bit_and %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet[%8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.pow %felt_const_2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %arg2, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %12 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.shr %0, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@aux] = %3 : <@BinSub_1::@BinSub_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BinSub_1::@BinSub_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@BinSub_1::@BinSub_1<[]>>, %arg1: !array.type<2,16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_65536 = felt.const 65536 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux] : <@BinSub_1::@BinSub_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_65536) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%c0, %9] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.pow %felt_const_2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %10, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%c1, %14] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.pow %felt_const_2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %13, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %18 : !felt.type<"babybear"> + } {product_source = "constrain"} + %3 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.pow %felt_const_2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %arg3, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %19 : !felt.type<"babybear"> + } {product_source = "constrain"} + %4 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.mul %1, %felt_const_65536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_2 { + struct.def @Bits2Num_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + } + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @A_3 { + struct.def @A_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sub : !struct.type<@BinSub_1::@BinSub_1<[]>> + struct.member @sub$inputs : !pod.type<[@in: !array.type<2,16 x !felt.type<"babybear">>]> + struct.member @n2ba : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2ba$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @b2n : !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + struct.member @b2n$inputs : !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> + struct.member @n2bb : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2bb$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@A_3::@A_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c16 = arith.constant {product_source = "compute"} 16 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %self = struct.new : <@A_3::@A_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2,16 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %28 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%28) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %29 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_6[@in] = %arg1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %4 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %28 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%28) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %29 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %30[%31] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%c0, %34] = %32 : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %33 : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %36 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %47 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @BinSub_1::@BinSub_1::@product(%47) : (!array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> + %49 = function.call @BinSub_1::@BinSub_1::@compute(%47) : (!array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %48 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %38 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %39[%40] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %42[%c1, %43] = %41 : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %42 : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %45 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @BinSub_1::@BinSub_1::@compute(%47) : (!array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %48 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %30[%31] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_4[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34] = %32 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %33 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %36 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %38 = pod.read %pod_4[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @Bits2Num_2::@Bits2Num_2::@product(%38) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + %40 = function.call @Bits2Num_2::@Bits2Num_2::@compute(%38) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sub$inputs] = %pod_0 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,16 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + struct.writem %self[@sub] = %8 : <@A_3::@A_3<[]>>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + struct.writem %self[@n2ba$inputs] = %pod_2 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2ba] = %9 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bb$inputs] = %pod_6 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %10 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bb] = %10 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@b2n$inputs] = %pod_4 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + struct.writem %self[@b2n] = %11 : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@sub] : <@A_3::@A_3<[]>>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@sub$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %self[@n2ba] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@n2ba$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = struct.readm %self[@b2n] : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@b2n$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %self[@n2bb] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %20 = struct.readm %self[@n2bb$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %21 = pod.read %16[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %20[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %15[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %14[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%c0, %33] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = struct.readm %19[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %14[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %38[%c1, %39] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %13[@out] : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %18[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %23 = struct.readm %17[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %14[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BinSub_1::@BinSub_1::@constrain(%13, %24) : (!struct.type<@BinSub_1::@BinSub_1<[]>>, !array.type<2,16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %25 = pod.read %16[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%15, %25) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %26 = pod.read %20[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%19, %26) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %27 = pod.read %18[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_2::@Bits2Num_2::@constrain(%17, %27) : (!struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@A_3::@A_3<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@A_3::@A_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c16 = arith.constant {product_source = "compute"} 16 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %self = struct.new : <@A_3::@A_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2,16 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c16 } : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %12 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_6[@in] = %arg1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %4 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %12 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%c0, %18] = %16 : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %31 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %32 = function.call @BinSub_1::@BinSub_1::@compute(%31) : (!array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %22 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %23 = struct.readm %22[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %23[%24] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%c1, %27] = %25 : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %26 : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %29 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %31 = pod.read %pod_0[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "compute"} + %32 = function.call @BinSub_1::@BinSub_1::@compute(%31) : (!array.type<2,16 x !felt.type<"babybear">>) -> !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @Bits2Num_2::@Bits2Num_2::@compute(%22) : (!array.type<16 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sub$inputs] = %pod_0 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,16 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BinSub_1::@BinSub_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + struct.writem %self[@sub] = %8 : <@A_3::@A_3<[]>>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "compute"} + struct.writem %self[@n2ba$inputs] = %pod_2 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2ba] = %9 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bb$inputs] = %pod_6 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %10 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bb] = %10 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@b2n$inputs] = %pod_4 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + struct.writem %self[@b2n] = %11 : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@A_3::@A_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@A_3::@A_3<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sub] : <@A_3::@A_3<[]>>, !struct.type<@BinSub_1::@BinSub_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sub$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2ba] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2ba$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = struct.readm %arg0[@b2n] : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@b2n$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<16 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@n2bb] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@n2bb$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c16 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %2[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%c0, %21] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %2[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%c1, %27] : <2,16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c16 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %1[@out] : <@BinSub_1::@BinSub_1<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %6[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = struct.readm %5[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %2[@in] : <[@in: !array.type<2,16 x !felt.type<"babybear">>]>, !array.type<2,16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BinSub_1::@BinSub_1::@constrain(%1, %12) : (!struct.type<@BinSub_1::@BinSub_1<[]>>, !array.type<2,16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %13) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %14 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%7, %14) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %15 = pod.read %6[@in] : <[@in: !array.type<16 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_2::@Bits2Num_2::@constrain(%5, %15) : (!struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, !array.type<16 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/calculateTotal_test.llzk b/examples/circom-demo/calculateTotal_test.llzk new file mode 100644 index 0000000..e87cc5a --- /dev/null +++ b/examples/circom-demo/calculateTotal_test.llzk @@ -0,0 +1,105 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>} { + poly.template @CalculateTotal_0 { + struct.def @CalculateTotal_0 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @sums : !array.type<6 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sums] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c6 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %5 : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + } + function.def @compute(%arg0: !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c6 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %1 : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, %arg1: !array.type<6 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sums] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c6 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/calculateTotal_test_fused.llzk b/examples/circom-demo/calculateTotal_test_fused.llzk new file mode 100644 index 0000000..e87cc5a --- /dev/null +++ b/examples/circom-demo/calculateTotal_test_fused.llzk @@ -0,0 +1,105 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>} { + poly.template @CalculateTotal_0 { + struct.def @CalculateTotal_0 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @sums : !array.type<6 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sums] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c6 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %5 : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + } + function.def @compute(%arg0: !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c6 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %1 : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, %arg1: !array.type<6 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sums] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c6 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/chi_test.llzk b/examples/circom-demo/chi_test.llzk new file mode 100644 index 0000000..6bc14a1 --- /dev/null +++ b/examples/circom-demo/chi_test.llzk @@ -0,0 +1,6087 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Chi_6::@Chi_6<[]>>} { + poly.template @XOR_0 { + struct.def @XOR_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_0::@XOR_0<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_0::@XOR_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_0::@XOR_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @XorArraySingle_1 { + struct.def @XorArraySingle_1 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArraySingle_1::@XorArraySingle_1<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %19 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %21 = function.call @XOR_0::@XOR_0::@compute(%19, %20) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %7[@comp] = %21 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %22 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%22] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %array_0[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %12[@b] = %felt_const_1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%13] = %12 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = array.read %array[%14] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.subi %16, %c1 : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.cmpi eq, %17, %c0 : index + scf.if %18 { + %19 = pod.read %12[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %21 = function.call @XOR_0::@XOR_0::@compute(%19, %20) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %15[@comp] = %21 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %22 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%22] = %15 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %4 = struct.readm %3[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_0::@XOR_0<[]>>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + array.write %array_1[%arg1] = %1 : <64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.writem %self[@out] = %nondet : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !struct.type<@XOR_0::@XOR_0<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %2[%9] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %11 = pod.read %10[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %6 = struct.readm %5[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg2] : <64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %4 = array.read %2[%arg2] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_0::@XOR_0::@constrain(%3, %5, %6) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @AND_2 { + struct.def @AND_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@AND_2::@AND_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_2::@AND_2<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_2::@AND_2<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_2::@AND_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_2::@AND_2<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_2::@AND_2<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @AndArray_3 { + struct.def @AndArray_3 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@AND_2::@AND_2<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_3::@AndArray_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@AndArray_3::@AndArray_3<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @AND_2::@AND_2::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_2::@AND_2<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_2::@AND_2<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @AND_2::@AND_2::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_2::@AND_2<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_2::@AND_2<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_2::@AND_2<[]>> + %4 = struct.readm %3[@out] : <@AND_2::@AND_2<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@AND_2::@AND_2<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@AND_2::@AND_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_2::@AND_2<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@AND_2::@AND_2<[]>>>, !struct.type<@AND_2::@AND_2<[]>> + } + struct.writem %self[@aux] = %array_1 : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !struct.type<@AND_2::@AND_2<[]>>> + struct.writem %self[@out] = %nondet : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@AndArray_3::@AndArray_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@AndArray_3::@AndArray_3<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !struct.type<@AND_2::@AND_2<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@AND_2::@AND_2<[]>>>, !struct.type<@AND_2::@AND_2<[]>> + %6 = struct.readm %5[@out] : <@AND_2::@AND_2<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@AND_2::@AND_2<[]>>>, !struct.type<@AND_2::@AND_2<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_2::@AND_2::@constrain(%3, %5, %6) : (!struct.type<@AND_2::@AND_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @XorArray_4 { + struct.def @XorArray_4 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_4::@XorArray_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArray_4::@XorArray_4<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_0::@XOR_0::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_0::@XOR_0::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + %4 = struct.readm %3[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_0::@XOR_0<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.writem %self[@out] = %nondet : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArray_4::@XorArray_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArray_4::@XorArray_4<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !struct.type<@XOR_0::@XOR_0<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %6 = struct.readm %5[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_0::@XOR_0::@constrain(%3, %5, %6) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @stepChi_5 { + struct.def @stepChi_5 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @bc : !struct.type<@AndArray_3::@AndArray_3<[]>> + struct.member @bc$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @abc : !struct.type<@XorArray_4::@XorArray_4<[]>> + struct.member @abc$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @bXor : !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + struct.member @bXor$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepChi_5::@stepChi_5<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @XorArraySingle_1::@XorArraySingle_1::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + %5 = struct.readm %4[@out] : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @AndArray_3::@AndArray_3::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_3::@AndArray_3<[]>> + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_3::@AndArray_3<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @AndArray_3::@AndArray_3::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_3::@AndArray_3<[]>> + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_3::@AndArray_3<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_4::@XorArray_4::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_4::@XorArray_4<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_4::@XorArray_4<[]>> + } + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_3::@AndArray_3<[]>> + %12 = struct.readm %11[@out] : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_4::@XorArray_4::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_4::@XorArray_4<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_4::@XorArray_4<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_4::@XorArray_4<[]>> + %5 = struct.readm %4[@out] : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@abc$inputs] = %pod_2 : <@stepChi_5::@stepChi_5<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_4::@XorArray_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_4::@XorArray_4<[]>> + struct.writem %self[@abc] = %0 : <@stepChi_5::@stepChi_5<[]>>, !struct.type<@XorArray_4::@XorArray_4<[]>> + struct.writem %self[@bXor$inputs] = %pod_4 : <@stepChi_5::@stepChi_5<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + struct.writem %self[@bXor] = %1 : <@stepChi_5::@stepChi_5<[]>>, !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + struct.writem %self[@bc$inputs] = %pod_0 : <@stepChi_5::@stepChi_5<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@AndArray_3::@AndArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_3::@AndArray_3<[]>> + struct.writem %self[@bc] = %2 : <@stepChi_5::@stepChi_5<[]>>, !struct.type<@AndArray_3::@AndArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepChi_5::@stepChi_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepChi_5::@stepChi_5<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@bc] : <@stepChi_5::@stepChi_5<[]>>, !struct.type<@AndArray_3::@AndArray_3<[]>> + %2 = struct.readm %arg0[@bc$inputs] : <@stepChi_5::@stepChi_5<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@abc] : <@stepChi_5::@stepChi_5<[]>>, !struct.type<@XorArray_4::@XorArray_4<[]>> + %4 = struct.readm %arg0[@abc$inputs] : <@stepChi_5::@stepChi_5<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@bXor] : <@stepChi_5::@stepChi_5<[]>>, !struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>> + %6 = struct.readm %arg0[@bXor$inputs] : <@stepChi_5::@stepChi_5<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = struct.readm %5[@out] : <@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %12 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %12 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %arg3[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg1[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = struct.readm %3[@out] : <@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %12 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %0[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_4::@XorArray_4::@constrain(%3, %7, %8) : (!struct.type<@XorArray_4::@XorArray_4<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArraySingle_1::@XorArraySingle_1::@constrain(%5, %9) : (!struct.type<@XorArraySingle_1::@XorArraySingle_1<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @AndArray_3::@AndArray_3::@constrain(%1, %10, %11) : (!struct.type<@AndArray_3::@AndArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Chi_6 { + struct.def @Chi_6 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @r11 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r8 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r6 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r14 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r5 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r21 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r22 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r10 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r4 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r15 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r17 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r12 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r1 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r2 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r24 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r0 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r9 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r18 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r20 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r23 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r16 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r19 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r13 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r3 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r7 : !struct.type<@stepChi_5::@stepChi_5<[]>> + struct.member @r7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_6::@Chi_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c192 = arith.constant {product_source = "compute"} 192 : index + %self = struct.new : <@Chi_6::@Chi_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %153 = array.read %arg0[%152] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %154 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %154[%155] = %153 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %154 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %157 = arith.subi %156, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %157 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.cmpi eq, %157, %c0 {product_source = "compute"} : index + scf.if %158 { + %175 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_5::@stepChi_5::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %159 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "compute"} + %161 = array.read %arg0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %162 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %162[%163] = %161 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %162 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %165 = arith.subi %164, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %165 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.cmpi eq, %165, %c0 {product_source = "compute"} : index + scf.if %166 { + %175 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_5::@stepChi_5::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %167 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %arg0[%168] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %170[%171] = %169 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@c] = %170 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %173 = arith.subi %172, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %173 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.cmpi eq, %173, %c0 {product_source = "compute"} : index + scf.if %174 { + %175 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_5::@stepChi_5::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %175 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_5::@stepChi_5::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %161 = array.read %arg0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %162 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %162[%163] = %161 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %162 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %165 = arith.subi %164, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %165 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.cmpi eq, %165, %c0 {product_source = "compute"} : index + scf.if %166 { + %175 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_5::@stepChi_5::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %167 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %arg0[%168] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %170[%171] = %169 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %170 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %173 = arith.subi %172, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %173 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.cmpi eq, %173, %c0 {product_source = "compute"} : index + scf.if %174 { + %175 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_5::@stepChi_5::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_5::@stepChi_5::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %153 = struct.readm %152[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %154 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %155 = array.read %153[%154] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%156] = %155 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %157 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %158 = struct.readm %157[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %159 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %160 = array.read %158[%159] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %162 = cast.toindex %161 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%162] = %160 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %164 = struct.readm %163[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %166 = array.read %164[%165] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%168] = %166 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %169 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %170 = struct.readm %169[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %172 = array.read %170[%171] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %174 = cast.toindex %173 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%174] = %172 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %175 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %176 = struct.readm %175[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %178 = array.read %176[%177] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %179 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %180 = cast.toindex %179 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%180] = %178 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %181 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %182 = struct.readm %181[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %183 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %184 = array.read %182[%183] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %185 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %186 = cast.toindex %185 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%186] = %184 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %187 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %188 = struct.readm %187[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %189 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %190 = array.read %188[%189] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %191 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%192] = %190 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %193 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %194 = struct.readm %193[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %197 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %198 = cast.toindex %197 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%198] = %196 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %199 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %200 = struct.readm %199[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %201 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %204 = cast.toindex %203 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%204] = %202 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %206 = struct.readm %205[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %208 = array.read %206[%207] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %209 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %210 = cast.toindex %209 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%210] = %208 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %212 = struct.readm %211[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %214 = array.read %212[%213] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %215 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%216] = %214 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %217 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %218 = struct.readm %217[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %219 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %220 = array.read %218[%219] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %221 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %222 = cast.toindex %221 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%222] = %220 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %223 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %224 = struct.readm %223[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %225 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %224[%225] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %228 = cast.toindex %227 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%228] = %226 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %229 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %230 = struct.readm %229[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %231 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %232 = array.read %230[%231] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %233 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %234 = cast.toindex %233 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%234] = %232 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %235 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %236 = struct.readm %235[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %238 = array.read %236[%237] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %239 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %240 = cast.toindex %239 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%240] = %238 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %241 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %242 = struct.readm %241[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %243 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %244 = array.read %242[%243] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %245 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %246 = cast.toindex %245 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%246] = %244 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %247 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %248 = struct.readm %247[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %249 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %250 = array.read %248[%249] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %251 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %252 = cast.toindex %251 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%252] = %250 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %253 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %254 = struct.readm %253[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %255 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %256 = array.read %254[%255] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %257 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %258 = cast.toindex %257 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%258] = %256 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %259 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %260 = struct.readm %259[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %261 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %262 = array.read %260[%261] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %263 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %264 = cast.toindex %263 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%264] = %262 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %265 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %266 = struct.readm %265[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %267 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %268 = array.read %266[%267] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %269 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %270 = cast.toindex %269 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%270] = %268 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %271 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %272 = struct.readm %271[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %273 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %274 = array.read %272[%273] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %275 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %276 = cast.toindex %275 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%276] = %274 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %277 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %278 = struct.readm %277[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %279 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %280 = array.read %278[%279] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %281 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %282 = cast.toindex %281 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%282] = %280 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %283 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %284 = struct.readm %283[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %285 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %286 = array.read %284[%285] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %287 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %288 = cast.toindex %287 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%288] = %286 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %289 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %290 = struct.readm %289[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %291 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %292 = array.read %290[%291] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %293 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %294 = cast.toindex %293 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%294] = %292 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %295 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %296 = struct.readm %295[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %297 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %298 = array.read %296[%297] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %299 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %300 = cast.toindex %299 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%300] = %298 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_26 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %0 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_30 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %1 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_14 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %2 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_6 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %3 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_22 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %4 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_32 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %5 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_34 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %6 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_38 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %7 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_40 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %8 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_48 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %9 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_18 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %10 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_10 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %11 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_24 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %12 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_36 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %13 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_4 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %14 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_12 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %15 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_8 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %16 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_28 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %17 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_16 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %18 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_20 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %19 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_0 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %20 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_44 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %21 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_42 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %22 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_2 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %23 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_46 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %24 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Chi_6::@Chi_6<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %25 = struct.readm %self[@out] : <@Chi_6::@Chi_6<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = struct.readm %self[@r11] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %27 = struct.readm %self[@r11$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = struct.readm %self[@r8] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %29 = struct.readm %self[@r8$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %30 = struct.readm %self[@r6] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %31 = struct.readm %self[@r6$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %32 = struct.readm %self[@r14] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %33 = struct.readm %self[@r14$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = struct.readm %self[@r5] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %35 = struct.readm %self[@r5$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %36 = struct.readm %self[@r21] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@r21$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = struct.readm %self[@r22] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@r22$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@r10] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@r10$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@r4] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@r4$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %44 = struct.readm %self[@r15] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@r15$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@r17] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@r17$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@r12] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@r12$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@r1] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@r1$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %52 = struct.readm %self[@r2] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %53 = struct.readm %self[@r2$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = struct.readm %self[@r24] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %55 = struct.readm %self[@r24$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %56 = struct.readm %self[@r0] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %57 = struct.readm %self[@r0$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = struct.readm %self[@r9] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %59 = struct.readm %self[@r9$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %60 = struct.readm %self[@r18] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %61 = struct.readm %self[@r18$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %62 = struct.readm %self[@r20] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %63 = struct.readm %self[@r20$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %64 = struct.readm %self[@r23] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %65 = struct.readm %self[@r23$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %66 = struct.readm %self[@r16] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %67 = struct.readm %self[@r16$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %68 = struct.readm %self[@r19] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %69 = struct.readm %self[@r19$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %70 = struct.readm %self[@r13] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %71 = struct.readm %self[@r13$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %72 = struct.readm %self[@r3] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %73 = struct.readm %self[@r3$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %74 = struct.readm %self[@r7] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %75 = struct.readm %self[@r7$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %153 = array.read %arg0[%152] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %154 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %156 = array.read %154[%155] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %156, %153 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg0[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg0[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %51[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %73[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg0[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg0[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %43[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %35[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %35[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %35[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %31[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %31[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %31[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %75[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %29[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %29[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %29[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %41[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %27[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %27[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %27[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %49[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %71[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %33[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %33[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %33[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %67[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %61[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %69[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %63[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = struct.readm %56[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %152[%153] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %156 = array.read %25[%155] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %156, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %50[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %25[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %52[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %167 = cast.toindex %166 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %25[%167] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = struct.readm %72[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %170 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %169[%170] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %173 = cast.toindex %172 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %25[%173] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = struct.readm %42[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %176 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %175[%176] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %179 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %25[%179] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = struct.readm %34[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %182 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %181[%182] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %185 = cast.toindex %184 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %25[%185] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %187 = struct.readm %30[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %188 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %189 = array.read %187[%188] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %190 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %191 = cast.toindex %190 : !felt.type<"babybear"> {product_source = "constrain"} + %192 = array.read %25[%191] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %192, %189 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = struct.readm %74[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %194 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %196 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "constrain"} + %198 = array.read %25[%197] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %198, %195 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = struct.readm %28[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %200 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %201 = array.read %199[%200] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %202 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %203 = cast.toindex %202 : !felt.type<"babybear"> {product_source = "constrain"} + %204 = array.read %25[%203] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %204, %201 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = struct.readm %58[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %206 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %207 = array.read %205[%206] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %208 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "constrain"} + %210 = array.read %25[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %210, %207 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = struct.readm %40[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %212 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %213 = array.read %211[%212] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %214 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %215 = cast.toindex %214 : !felt.type<"babybear"> {product_source = "constrain"} + %216 = array.read %25[%215] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %216, %213 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = struct.readm %26[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %218 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %219 = array.read %217[%218] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %220 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %221 = cast.toindex %220 : !felt.type<"babybear"> {product_source = "constrain"} + %222 = array.read %25[%221] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %222, %219 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %223 = struct.readm %48[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %224 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %225 = array.read %223[%224] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %226 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %227 = cast.toindex %226 : !felt.type<"babybear"> {product_source = "constrain"} + %228 = array.read %25[%227] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %228, %225 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %229 = struct.readm %70[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %230 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %231 = array.read %229[%230] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %232 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %233 = cast.toindex %232 : !felt.type<"babybear"> {product_source = "constrain"} + %234 = array.read %25[%233] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %234, %231 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %235 = struct.readm %32[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %236 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %237 = array.read %235[%236] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %238 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %239 = cast.toindex %238 : !felt.type<"babybear"> {product_source = "constrain"} + %240 = array.read %25[%239] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %240, %237 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %241 = struct.readm %44[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %242 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %243 = array.read %241[%242] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %244 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %245 = cast.toindex %244 : !felt.type<"babybear"> {product_source = "constrain"} + %246 = array.read %25[%245] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %246, %243 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %247 = struct.readm %66[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %248 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %249 = array.read %247[%248] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %250 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %251 = cast.toindex %250 : !felt.type<"babybear"> {product_source = "constrain"} + %252 = array.read %25[%251] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %252, %249 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %253 = struct.readm %46[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %254 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %255 = array.read %253[%254] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %256 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %257 = cast.toindex %256 : !felt.type<"babybear"> {product_source = "constrain"} + %258 = array.read %25[%257] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %258, %255 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %259 = struct.readm %60[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %260 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %261 = array.read %259[%260] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %262 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %263 = cast.toindex %262 : !felt.type<"babybear"> {product_source = "constrain"} + %264 = array.read %25[%263] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %264, %261 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %265 = struct.readm %68[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %266 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %267 = array.read %265[%266] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %268 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %269 = cast.toindex %268 : !felt.type<"babybear"> {product_source = "constrain"} + %270 = array.read %25[%269] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %270, %267 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %271 = struct.readm %62[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %272 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %273 = array.read %271[%272] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %274 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %275 = cast.toindex %274 : !felt.type<"babybear"> {product_source = "constrain"} + %276 = array.read %25[%275] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %276, %273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %277 = struct.readm %36[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %278 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %279 = array.read %277[%278] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %280 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %281 = cast.toindex %280 : !felt.type<"babybear"> {product_source = "constrain"} + %282 = array.read %25[%281] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %282, %279 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %283 = struct.readm %38[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %284 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %285 = array.read %283[%284] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %286 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %287 = cast.toindex %286 : !felt.type<"babybear"> {product_source = "constrain"} + %288 = array.read %25[%287] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %288, %285 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %289 = struct.readm %64[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %290 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %291 = array.read %289[%290] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %292 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %293 = cast.toindex %292 : !felt.type<"babybear"> {product_source = "constrain"} + %294 = array.read %25[%293] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %294, %291 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %295 = struct.readm %54[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %296 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %297 = array.read %295[%296] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %298 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %299 = cast.toindex %298 : !felt.type<"babybear"> {product_source = "constrain"} + %300 = array.read %25[%299] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %300, %297 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %76 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%52, %76, %77, %78) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %79 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%56, %79, %80, %81) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %82 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = pod.read %41[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%40, %82, %83, %84) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %85 = pod.read %33[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %33[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %87 = pod.read %33[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%32, %85, %86, %87) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %88 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = pod.read %49[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%48, %88, %89, %90) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %91 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %93 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%58, %91, %92, %93) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %94 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %95 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %96 = pod.read %61[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%60, %94, %95, %96) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %97 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %99 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%64, %97, %98, %99) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %100 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %101 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = pod.read %67[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%66, %100, %101, %102) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %103 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %105 = pod.read %75[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%74, %103, %104, %105) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %106 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %108 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%44, %106, %107, %108) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %109 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%36, %109, %110, %111) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %114 = pod.read %51[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%50, %112, %113, %114) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %115 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %117 = pod.read %63[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%62, %115, %116, %117) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %118 = pod.read %31[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %31[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %31[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%30, %118, %119, %120) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %121 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%38, %121, %122, %123) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %124 = pod.read %35[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %35[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %126 = pod.read %35[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%34, %124, %125, %126) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %127 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%54, %127, %128, %129) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %130 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = pod.read %43[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%42, %130, %131, %132) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %133 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %134 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%46, %133, %134, %135) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %27[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %27[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = pod.read %27[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%26, %136, %137, %138) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %139 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %71[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%70, %139, %140, %141) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %142 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = pod.read %69[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%68, %142, %143, %144) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %145 = pod.read %29[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = pod.read %29[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %147 = pod.read %29[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%28, %145, %146, %147) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %148 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %150 = pod.read %73[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%72, %148, %149, %150) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Chi_6::@Chi_6<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_6::@Chi_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c192 = arith.constant {product_source = "compute"} 192 : index + %self = struct.new : <@Chi_6::@Chi_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %31 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %49 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_5::@stepChi_5::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %33 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %arg0[%34] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %36 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %39 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_5::@stepChi_5::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg0[%42] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45] = %43 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@c] = %44 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %47 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %49 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_5::@stepChi_5::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %49 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_5::@stepChi_5::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %arg0[%34] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %36 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %39 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_5::@stepChi_5::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg0[%42] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45] = %43 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %44 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %47 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %49 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_5::@stepChi_5::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_5::@stepChi_5::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %27 = struct.readm %26[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %27[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%30] = %29 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %32[%33] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%36] = %34 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %38[%39] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %40 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %44[%45] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%48] = %46 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %50 = struct.readm %49[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %50[%51] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %52 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %56 = struct.readm %55[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %56[%57] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%60] = %58 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %62[%63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%66] = %64 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %67 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %68 = struct.readm %67[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %69 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %68[%69] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%72] = %70 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %74 = struct.readm %73[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %75 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %74[%75] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%78] = %76 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %80 = struct.readm %79[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %80[%81] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%84] = %82 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %87 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %86[%87] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %89 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%90] = %88 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %92 = struct.readm %91[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %92[%93] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %95 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %95 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%96] = %94 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %97 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %99 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %98[%99] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%102] = %100 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %103 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %104 = struct.readm %103[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %105 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %106 = array.read %104[%105] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %107 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %108 = cast.toindex %107 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%108] = %106 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %109 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %110 = struct.readm %109[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %111 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %112 = array.read %110[%111] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %113 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %114 = cast.toindex %113 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%114] = %112 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %115 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %116 = struct.readm %115[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %117 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %116[%117] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %119 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %120 = cast.toindex %119 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%120] = %118 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %121 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %122 = struct.readm %121[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %123 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %122[%123] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %125 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %125 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%126] = %124 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %127 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %128 = struct.readm %127[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %129 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %130 = array.read %128[%129] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %131 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %132 = cast.toindex %131 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%132] = %130 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %134 = struct.readm %133[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %135 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %136 = array.read %134[%135] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %137 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %138 = cast.toindex %137 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%138] = %136 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %139 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %140 = struct.readm %139[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %141 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %142 = array.read %140[%141] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %143 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %144 = cast.toindex %143 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%144] = %142 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %145 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %146 = struct.readm %145[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %147 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %148 = array.read %146[%147] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %149 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %150 = cast.toindex %149 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%150] = %148 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %151 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %152 = struct.readm %151[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %153 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %152[%153] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %156 = cast.toindex %155 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%156] = %154 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %157 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %158 = struct.readm %157[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %159 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %160 = array.read %158[%159] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %162 = cast.toindex %161 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%162] = %160 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %164 = struct.readm %163[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %166 = array.read %164[%165] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%168] = %166 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %169 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + %170 = struct.readm %169[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %172 = array.read %170[%171] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %174 = cast.toindex %173 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%174] = %172 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_26 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %0 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_30 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %1 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_14 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %2 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_6 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %3 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_22 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %4 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_32 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %5 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_34 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %6 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_38 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %7 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_40 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %8 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_48 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %9 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_18 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %10 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_10 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %11 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_24 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %12 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_36 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %13 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_4 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %14 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_12 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %15 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_8 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %16 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_28 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %17 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_16 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %18 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_20 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %19 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_0 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %20 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_44 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %21 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_42 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %22 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_2 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %23 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_46 : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_5::@stepChi_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %24 : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Chi_6::@Chi_6<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Chi_6::@Chi_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@Chi_6::@Chi_6<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Chi_6::@Chi_6<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@r11] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@r11$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@r8] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@r8$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@r6] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@r6$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@r14] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@r14$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@r5] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@r5$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@r21] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@r21$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@r22] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@r22$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@r10] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@r10$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@r4] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@r4$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@r15] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@r15$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@r17] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@r17$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@r12] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@r12$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@r1] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@r1$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@r2] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@r2$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@r24] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@r24$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@r0] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@r0$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@r9] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@r9$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@r18] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@r18$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@r20] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@r20$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@r23] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@r23$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@r16] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@r16$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@r19] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@r19$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@r13] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@r13$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@r3] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@r3$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %arg0[@r7] : <@Chi_6::@Chi_6<[]>>, !struct.type<@stepChi_5::@stepChi_5<[]>> {product_source = "constrain"} + %50 = struct.readm %arg0[@r7$inputs] : <@Chi_6::@Chi_6<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %128 = array.read %arg1[%127] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %129 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %130 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %129[%130] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = cast.toindex %132 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %arg1[%133] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %135[%136] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %arg1[%139] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %141[%142] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %arg1[%133] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %135[%136] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %arg1[%139] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %141[%142] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = struct.readm %31[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %127[%128] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %0[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = struct.readm %25[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %136 = cast.toindex %135 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %0[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = struct.readm %27[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %142 = cast.toindex %141 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %0[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %144 = struct.readm %47[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %147 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %148 = cast.toindex %147 : !felt.type<"babybear"> {product_source = "constrain"} + %149 = array.read %0[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %150 = struct.readm %17[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %153 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %154 = cast.toindex %153 : !felt.type<"babybear"> {product_source = "constrain"} + %155 = array.read %0[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %156 = struct.readm %9[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %5[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %166 = cast.toindex %165 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %0[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = struct.readm %49[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %172 = cast.toindex %171 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %0[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = struct.readm %3[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %178 = cast.toindex %177 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %0[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = struct.readm %33[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %181 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %184 = cast.toindex %183 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %0[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %186 = struct.readm %15[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %187 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %189 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %190 = cast.toindex %189 : !felt.type<"babybear"> {product_source = "constrain"} + %191 = array.read %0[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %1[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %0[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %23[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %202 = cast.toindex %201 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %0[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = struct.readm %45[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %205 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = struct.readm %7[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %211 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %214 = cast.toindex %213 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %0[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = struct.readm %19[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %217 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %220 = cast.toindex %219 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %0[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %222 = struct.readm %41[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %223 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %224 = array.read %222[%223] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %225 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %226 = cast.toindex %225 : !felt.type<"babybear"> {product_source = "constrain"} + %227 = array.read %0[%226] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %227, %224 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %228 = struct.readm %21[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %229 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %230 = array.read %228[%229] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %231 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %232 = cast.toindex %231 : !felt.type<"babybear"> {product_source = "constrain"} + %233 = array.read %0[%232] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %233, %230 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %234 = struct.readm %35[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %235 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %236 = array.read %234[%235] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %237 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %238 = cast.toindex %237 : !felt.type<"babybear"> {product_source = "constrain"} + %239 = array.read %0[%238] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %239, %236 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %240 = struct.readm %43[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %241 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %242 = array.read %240[%241] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %243 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %244 = cast.toindex %243 : !felt.type<"babybear"> {product_source = "constrain"} + %245 = array.read %0[%244] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %245, %242 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %246 = struct.readm %37[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %247 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %248 = array.read %246[%247] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %249 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %250 = cast.toindex %249 : !felt.type<"babybear"> {product_source = "constrain"} + %251 = array.read %0[%250] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %251, %248 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %252 = struct.readm %11[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %253 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %254 = array.read %252[%253] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %255 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %256 = cast.toindex %255 : !felt.type<"babybear"> {product_source = "constrain"} + %257 = array.read %0[%256] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %257, %254 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %258 = struct.readm %13[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %259 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %260 = array.read %258[%259] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %261 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %262 = cast.toindex %261 : !felt.type<"babybear"> {product_source = "constrain"} + %263 = array.read %0[%262] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %263, %260 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %264 = struct.readm %39[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %265 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %266 = array.read %264[%265] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %267 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %268 = cast.toindex %267 : !felt.type<"babybear"> {product_source = "constrain"} + %269 = array.read %0[%268] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %269, %266 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %270 = struct.readm %29[@out] : <@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %271 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %272 = array.read %270[%271] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %273 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %274 = cast.toindex %273 : !felt.type<"babybear"> {product_source = "constrain"} + %275 = array.read %0[%274] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %275, %272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %51 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = pod.read %28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%27, %51, %52, %53) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %54 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = pod.read %32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%31, %54, %55, %56) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %57 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = pod.read %16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%15, %57, %58, %59) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %60 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = pod.read %8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%7, %60, %61, %62) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %63 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%23, %63, %64, %65) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %66 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = pod.read %34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%33, %66, %67, %68) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %69 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %70 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = pod.read %36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%35, %69, %70, %71) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %72 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %73 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%39, %72, %73, %74) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%41, %75, %76, %77) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %78 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %79 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%49, %78, %79, %80) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %81 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%19, %81, %82, %83) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %84 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %85 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%11, %84, %85, %86) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %87 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%25, %87, %88, %89) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %90 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %91 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%37, %90, %91, %92) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %94 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %95 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%5, %93, %94, %95) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %96 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %97 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%13, %96, %97, %98) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %99 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %100 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %101 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%9, %99, %100, %101) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %102 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %103 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%29, %102, %103, %104) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %105 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %106 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%17, %105, %106, %107) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %108 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%21, %108, %109, %110) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %111 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %112 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%1, %111, %112, %113) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %114 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%45, %114, %115, %116) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %117 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %118 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%43, %117, %118, %119) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %120 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%3, %120, %121, %122) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %123 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_5::@stepChi_5::@constrain(%47, %123, %124, %125) : (!struct.type<@stepChi_5::@stepChi_5<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/constants_test.llzk b/examples/circom-demo/constants_test.llzk new file mode 100644 index 0000000..1f588ee --- /dev/null +++ b/examples/circom-demo/constants_test.llzk @@ -0,0 +1,1056 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@A_1::@A_1<[]>>} { + poly.template @K_0 { + struct.def @K_0 { + struct.member @out : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@K_0::@K_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_3329325298 = felt.const 3329325298 : <"babybear"> {product_source = "compute"} + %felt_const_3204031479 = felt.const 3204031479 : <"babybear"> {product_source = "compute"} + %felt_const_2756734187 = felt.const 2756734187 : <"babybear"> {product_source = "compute"} + %felt_const_2428436474 = felt.const 2428436474 : <"babybear"> {product_source = "compute"} + %felt_const_2361852424 = felt.const 2361852424 : <"babybear"> {product_source = "compute"} + %felt_const_2227730452 = felt.const 2227730452 : <"babybear"> {product_source = "compute"} + %felt_const_2024104815 = felt.const 2024104815 : <"babybear"> {product_source = "compute"} + %felt_const_1955562222 = felt.const 1955562222 : <"babybear"> {product_source = "compute"} + %felt_const_1747873779 = felt.const 1747873779 : <"babybear"> {product_source = "compute"} + %felt_const_1537002063 = felt.const 1537002063 : <"babybear"> {product_source = "compute"} + %felt_const_1322822218 = felt.const 1322822218 : <"babybear"> {product_source = "compute"} + %felt_const_958139571 = felt.const 958139571 : <"babybear"> {product_source = "compute"} + %felt_const_883997877 = felt.const 883997877 : <"babybear"> {product_source = "compute"} + %felt_const_659060556 = felt.const 659060556 : <"babybear"> {product_source = "compute"} + %felt_const_506948616 = felt.const 506948616 : <"babybear"> {product_source = "compute"} + %felt_const_430227734 = felt.const 430227734 : <"babybear"> {product_source = "compute"} + %felt_const_275423344 = felt.const 275423344 : <"babybear"> {product_source = "compute"} + %felt_const_4094571909 = felt.const 4094571909 : <"babybear"> {product_source = "compute"} + %felt_const_3600352804 = felt.const 3600352804 : <"babybear"> {product_source = "compute"} + %felt_const_3516065817 = felt.const 3516065817 : <"babybear"> {product_source = "compute"} + %felt_const_3345764771 = felt.const 3345764771 : <"babybear"> {product_source = "compute"} + %felt_const_3259730800 = felt.const 3259730800 : <"babybear"> {product_source = "compute"} + %felt_const_2820302411 = felt.const 2820302411 : <"babybear"> {product_source = "compute"} + %felt_const_2730485921 = felt.const 2730485921 : <"babybear"> {product_source = "compute"} + %felt_const_2456956037 = felt.const 2456956037 : <"babybear"> {product_source = "compute"} + %felt_const_2177026350 = felt.const 2177026350 : <"babybear"> {product_source = "compute"} + %felt_const_1986661051 = felt.const 1986661051 : <"babybear"> {product_source = "compute"} + %felt_const_1695183700 = felt.const 1695183700 : <"babybear"> {product_source = "compute"} + %felt_const_1396182291 = felt.const 1396182291 : <"babybear"> {product_source = "compute"} + %felt_const_1294757372 = felt.const 1294757372 : <"babybear"> {product_source = "compute"} + %felt_const_773529912 = felt.const 773529912 : <"babybear"> {product_source = "compute"} + %felt_const_666307205 = felt.const 666307205 : <"babybear"> {product_source = "compute"} + %felt_const_338241895 = felt.const 338241895 : <"babybear"> {product_source = "compute"} + %felt_const_113926993 = felt.const 113926993 : <"babybear"> {product_source = "compute"} + %felt_const_3584528711 = felt.const 3584528711 : <"babybear"> {product_source = "compute"} + %felt_const_3336571891 = felt.const 3336571891 : <"babybear"> {product_source = "compute"} + %felt_const_3210313671 = felt.const 3210313671 : <"babybear"> {product_source = "compute"} + %felt_const_2952996808 = felt.const 2952996808 : <"babybear"> {product_source = "compute"} + %felt_const_2821834349 = felt.const 2821834349 : <"babybear"> {product_source = "compute"} + %felt_const_2554220882 = felt.const 2554220882 : <"babybear"> {product_source = "compute"} + %felt_const_1996064986 = felt.const 1996064986 : <"babybear"> {product_source = "compute"} + %felt_const_1555081692 = felt.const 1555081692 : <"babybear"> {product_source = "compute"} + %felt_const_1249150122 = felt.const 1249150122 : <"babybear"> {product_source = "compute"} + %felt_const_770255983 = felt.const 770255983 : <"babybear"> {product_source = "compute"} + %felt_const_604807628 = felt.const 604807628 : <"babybear"> {product_source = "compute"} + %felt_const_264347078 = felt.const 264347078 : <"babybear"> {product_source = "compute"} + %felt_const_4022224774 = felt.const 4022224774 : <"babybear"> {product_source = "compute"} + %felt_const_3835390401 = felt.const 3835390401 : <"babybear"> {product_source = "compute"} + %felt_const_3248222580 = felt.const 3248222580 : <"babybear"> {product_source = "compute"} + %felt_const_2614888103 = felt.const 2614888103 : <"babybear"> {product_source = "compute"} + %felt_const_2162078206 = felt.const 2162078206 : <"babybear"> {product_source = "compute"} + %felt_const_1925078388 = felt.const 1925078388 : <"babybear"> {product_source = "compute"} + %felt_const_1426881987 = felt.const 1426881987 : <"babybear"> {product_source = "compute"} + %felt_const_607225278 = felt.const 607225278 : <"babybear"> {product_source = "compute"} + %felt_const_310598401 = felt.const 310598401 : <"babybear"> {product_source = "compute"} + %felt_const_3624381080 = felt.const 3624381080 : <"babybear"> {product_source = "compute"} + %felt_const_2870763221 = felt.const 2870763221 : <"babybear"> {product_source = "compute"} + %felt_const_2453635748 = felt.const 2453635748 : <"babybear"> {product_source = "compute"} + %felt_const_1508970993 = felt.const 1508970993 : <"babybear"> {product_source = "compute"} + %felt_const_961987163 = felt.const 961987163 : <"babybear"> {product_source = "compute"} + %felt_const_3921009573 = felt.const 3921009573 : <"babybear"> {product_source = "compute"} + %felt_const_3049323471 = felt.const 3049323471 : <"babybear"> {product_source = "compute"} + %felt_const_1899447441 = felt.const 1899447441 : <"babybear"> {product_source = "compute"} + %felt_const_1116352408 = felt.const 1116352408 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@K_0::@K_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1116352408 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_1899447441 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_3049323471 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_3921009573 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_961987163 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_1508970993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_2453635748 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_2870763221 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_3624381080 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_310598401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_607225278 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_1426881987 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_1925078388 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_2162078206 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_2614888103 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_3248222580 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_3835390401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_4022224774 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_264347078 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_604807628 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_770255983 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_1249150122 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_1555081692 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_1996064986 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c24] = %felt_const_2554220882 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c25] = %felt_const_2821834349 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c26] = %felt_const_2952996808 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c27] = %felt_const_3210313671 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c28] = %felt_const_3336571891 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c29] = %felt_const_3584528711 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c30] = %felt_const_113926993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c31] = %felt_const_338241895 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c32] = %felt_const_666307205 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c33] = %felt_const_773529912 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c34] = %felt_const_1294757372 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c35] = %felt_const_1396182291 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c36] = %felt_const_1695183700 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c37] = %felt_const_1986661051 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c38] = %felt_const_2177026350 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c39] = %felt_const_2456956037 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c40] = %felt_const_2730485921 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c41] = %felt_const_2820302411 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c42] = %felt_const_3259730800 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c43] = %felt_const_3345764771 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c44] = %felt_const_3516065817 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c45] = %felt_const_3600352804 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c46] = %felt_const_4094571909 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c47] = %felt_const_275423344 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c48] = %felt_const_430227734 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c49] = %felt_const_506948616 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c50] = %felt_const_659060556 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c51] = %felt_const_883997877 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c52] = %felt_const_958139571 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c53] = %felt_const_1322822218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c54] = %felt_const_1537002063 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c55] = %felt_const_1747873779 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c56] = %felt_const_1955562222 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c57] = %felt_const_2024104815 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c58] = %felt_const_2227730452 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c59] = %felt_const_2361852424 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c60] = %felt_const_2428436474 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c61] = %felt_const_2756734187 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c62] = %felt_const_3204031479 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c63] = %felt_const_3329325298 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_1116352408 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_1899447441 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_3049323471 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_3921009573 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_961987163 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_1508970993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_2453635748 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_2870763221 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_3624381080 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_310598401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_607225278 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_1426881987 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_1925078388 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_2162078206 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_2614888103 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_3248222580 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_3835390401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_4022224774 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_264347078 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_604807628 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_770255983 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_1249150122 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_1555081692 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_1996064986 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c24] = %felt_const_2554220882 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c25] = %felt_const_2821834349 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c26] = %felt_const_2952996808 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c27] = %felt_const_3210313671 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c28] = %felt_const_3336571891 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c29] = %felt_const_3584528711 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c30] = %felt_const_113926993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c31] = %felt_const_338241895 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c32] = %felt_const_666307205 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c33] = %felt_const_773529912 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c34] = %felt_const_1294757372 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c35] = %felt_const_1396182291 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c36] = %felt_const_1695183700 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c37] = %felt_const_1986661051 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c38] = %felt_const_2177026350 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c39] = %felt_const_2456956037 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c40] = %felt_const_2730485921 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c41] = %felt_const_2820302411 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c42] = %felt_const_3259730800 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c43] = %felt_const_3345764771 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c44] = %felt_const_3516065817 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c45] = %felt_const_3600352804 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c46] = %felt_const_4094571909 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c47] = %felt_const_275423344 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c48] = %felt_const_430227734 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c49] = %felt_const_506948616 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c50] = %felt_const_659060556 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c51] = %felt_const_883997877 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c52] = %felt_const_958139571 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c53] = %felt_const_1322822218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c54] = %felt_const_1537002063 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c55] = %felt_const_1747873779 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c56] = %felt_const_1955562222 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c57] = %felt_const_2024104815 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c58] = %felt_const_2227730452 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c59] = %felt_const_2361852424 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c60] = %felt_const_2428436474 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c61] = %felt_const_2756734187 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c62] = %felt_const_3204031479 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c63] = %felt_const_3329325298 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg0 = %c0 to %c32 step %c1 { + %1 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %felt_const_3624381080, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.shr %felt_const_3624381080, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.bit_and %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@K_0::@K_0<[]>> + } + function.def @compute() -> !struct.type<@K_0::@K_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_3329325298 = felt.const 3329325298 : <"babybear"> {product_source = "compute"} + %felt_const_3204031479 = felt.const 3204031479 : <"babybear"> {product_source = "compute"} + %felt_const_2756734187 = felt.const 2756734187 : <"babybear"> {product_source = "compute"} + %felt_const_2428436474 = felt.const 2428436474 : <"babybear"> {product_source = "compute"} + %felt_const_2361852424 = felt.const 2361852424 : <"babybear"> {product_source = "compute"} + %felt_const_2227730452 = felt.const 2227730452 : <"babybear"> {product_source = "compute"} + %felt_const_2024104815 = felt.const 2024104815 : <"babybear"> {product_source = "compute"} + %felt_const_1955562222 = felt.const 1955562222 : <"babybear"> {product_source = "compute"} + %felt_const_1747873779 = felt.const 1747873779 : <"babybear"> {product_source = "compute"} + %felt_const_1537002063 = felt.const 1537002063 : <"babybear"> {product_source = "compute"} + %felt_const_1322822218 = felt.const 1322822218 : <"babybear"> {product_source = "compute"} + %felt_const_958139571 = felt.const 958139571 : <"babybear"> {product_source = "compute"} + %felt_const_883997877 = felt.const 883997877 : <"babybear"> {product_source = "compute"} + %felt_const_659060556 = felt.const 659060556 : <"babybear"> {product_source = "compute"} + %felt_const_506948616 = felt.const 506948616 : <"babybear"> {product_source = "compute"} + %felt_const_430227734 = felt.const 430227734 : <"babybear"> {product_source = "compute"} + %felt_const_275423344 = felt.const 275423344 : <"babybear"> {product_source = "compute"} + %felt_const_4094571909 = felt.const 4094571909 : <"babybear"> {product_source = "compute"} + %felt_const_3600352804 = felt.const 3600352804 : <"babybear"> {product_source = "compute"} + %felt_const_3516065817 = felt.const 3516065817 : <"babybear"> {product_source = "compute"} + %felt_const_3345764771 = felt.const 3345764771 : <"babybear"> {product_source = "compute"} + %felt_const_3259730800 = felt.const 3259730800 : <"babybear"> {product_source = "compute"} + %felt_const_2820302411 = felt.const 2820302411 : <"babybear"> {product_source = "compute"} + %felt_const_2730485921 = felt.const 2730485921 : <"babybear"> {product_source = "compute"} + %felt_const_2456956037 = felt.const 2456956037 : <"babybear"> {product_source = "compute"} + %felt_const_2177026350 = felt.const 2177026350 : <"babybear"> {product_source = "compute"} + %felt_const_1986661051 = felt.const 1986661051 : <"babybear"> {product_source = "compute"} + %felt_const_1695183700 = felt.const 1695183700 : <"babybear"> {product_source = "compute"} + %felt_const_1396182291 = felt.const 1396182291 : <"babybear"> {product_source = "compute"} + %felt_const_1294757372 = felt.const 1294757372 : <"babybear"> {product_source = "compute"} + %felt_const_773529912 = felt.const 773529912 : <"babybear"> {product_source = "compute"} + %felt_const_666307205 = felt.const 666307205 : <"babybear"> {product_source = "compute"} + %felt_const_338241895 = felt.const 338241895 : <"babybear"> {product_source = "compute"} + %felt_const_113926993 = felt.const 113926993 : <"babybear"> {product_source = "compute"} + %felt_const_3584528711 = felt.const 3584528711 : <"babybear"> {product_source = "compute"} + %felt_const_3336571891 = felt.const 3336571891 : <"babybear"> {product_source = "compute"} + %felt_const_3210313671 = felt.const 3210313671 : <"babybear"> {product_source = "compute"} + %felt_const_2952996808 = felt.const 2952996808 : <"babybear"> {product_source = "compute"} + %felt_const_2821834349 = felt.const 2821834349 : <"babybear"> {product_source = "compute"} + %felt_const_2554220882 = felt.const 2554220882 : <"babybear"> {product_source = "compute"} + %felt_const_1996064986 = felt.const 1996064986 : <"babybear"> {product_source = "compute"} + %felt_const_1555081692 = felt.const 1555081692 : <"babybear"> {product_source = "compute"} + %felt_const_1249150122 = felt.const 1249150122 : <"babybear"> {product_source = "compute"} + %felt_const_770255983 = felt.const 770255983 : <"babybear"> {product_source = "compute"} + %felt_const_604807628 = felt.const 604807628 : <"babybear"> {product_source = "compute"} + %felt_const_264347078 = felt.const 264347078 : <"babybear"> {product_source = "compute"} + %felt_const_4022224774 = felt.const 4022224774 : <"babybear"> {product_source = "compute"} + %felt_const_3835390401 = felt.const 3835390401 : <"babybear"> {product_source = "compute"} + %felt_const_3248222580 = felt.const 3248222580 : <"babybear"> {product_source = "compute"} + %felt_const_2614888103 = felt.const 2614888103 : <"babybear"> {product_source = "compute"} + %felt_const_2162078206 = felt.const 2162078206 : <"babybear"> {product_source = "compute"} + %felt_const_1925078388 = felt.const 1925078388 : <"babybear"> {product_source = "compute"} + %felt_const_1426881987 = felt.const 1426881987 : <"babybear"> {product_source = "compute"} + %felt_const_607225278 = felt.const 607225278 : <"babybear"> {product_source = "compute"} + %felt_const_310598401 = felt.const 310598401 : <"babybear"> {product_source = "compute"} + %felt_const_3624381080 = felt.const 3624381080 : <"babybear"> {product_source = "compute"} + %felt_const_2870763221 = felt.const 2870763221 : <"babybear"> {product_source = "compute"} + %felt_const_2453635748 = felt.const 2453635748 : <"babybear"> {product_source = "compute"} + %felt_const_1508970993 = felt.const 1508970993 : <"babybear"> {product_source = "compute"} + %felt_const_961987163 = felt.const 961987163 : <"babybear"> {product_source = "compute"} + %felt_const_3921009573 = felt.const 3921009573 : <"babybear"> {product_source = "compute"} + %felt_const_3049323471 = felt.const 3049323471 : <"babybear"> {product_source = "compute"} + %felt_const_1899447441 = felt.const 1899447441 : <"babybear"> {product_source = "compute"} + %felt_const_1116352408 = felt.const 1116352408 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@K_0::@K_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1116352408 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_1899447441 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_3049323471 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_3921009573 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_961987163 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_1508970993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_2453635748 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_2870763221 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_3624381080 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_310598401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_607225278 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_1426881987 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_1925078388 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_2162078206 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_2614888103 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_3248222580 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_3835390401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_4022224774 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_264347078 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_604807628 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_770255983 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_1249150122 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_1555081692 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_1996064986 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c24] = %felt_const_2554220882 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c25] = %felt_const_2821834349 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c26] = %felt_const_2952996808 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c27] = %felt_const_3210313671 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c28] = %felt_const_3336571891 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c29] = %felt_const_3584528711 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c30] = %felt_const_113926993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c31] = %felt_const_338241895 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c32] = %felt_const_666307205 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c33] = %felt_const_773529912 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c34] = %felt_const_1294757372 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c35] = %felt_const_1396182291 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c36] = %felt_const_1695183700 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c37] = %felt_const_1986661051 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c38] = %felt_const_2177026350 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c39] = %felt_const_2456956037 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c40] = %felt_const_2730485921 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c41] = %felt_const_2820302411 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c42] = %felt_const_3259730800 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c43] = %felt_const_3345764771 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c44] = %felt_const_3516065817 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c45] = %felt_const_3600352804 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c46] = %felt_const_4094571909 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c47] = %felt_const_275423344 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c48] = %felt_const_430227734 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c49] = %felt_const_506948616 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c50] = %felt_const_659060556 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c51] = %felt_const_883997877 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c52] = %felt_const_958139571 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c53] = %felt_const_1322822218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c54] = %felt_const_1537002063 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c55] = %felt_const_1747873779 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c56] = %felt_const_1955562222 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c57] = %felt_const_2024104815 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c58] = %felt_const_2227730452 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c59] = %felt_const_2361852424 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c60] = %felt_const_2428436474 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c61] = %felt_const_2756734187 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c62] = %felt_const_3204031479 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c63] = %felt_const_3329325298 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg0 = %c0 to %c32 step %c1 { + %0 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_3624381080, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %2 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@K_0::@K_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@K_0::@K_0<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_3329325298 = felt.const 3329325298 : <"babybear"> {product_source = "constrain"} + %felt_const_3204031479 = felt.const 3204031479 : <"babybear"> {product_source = "constrain"} + %felt_const_2756734187 = felt.const 2756734187 : <"babybear"> {product_source = "constrain"} + %felt_const_2428436474 = felt.const 2428436474 : <"babybear"> {product_source = "constrain"} + %felt_const_2361852424 = felt.const 2361852424 : <"babybear"> {product_source = "constrain"} + %felt_const_2227730452 = felt.const 2227730452 : <"babybear"> {product_source = "constrain"} + %felt_const_2024104815 = felt.const 2024104815 : <"babybear"> {product_source = "constrain"} + %felt_const_1955562222 = felt.const 1955562222 : <"babybear"> {product_source = "constrain"} + %felt_const_1747873779 = felt.const 1747873779 : <"babybear"> {product_source = "constrain"} + %felt_const_1537002063 = felt.const 1537002063 : <"babybear"> {product_source = "constrain"} + %felt_const_1322822218 = felt.const 1322822218 : <"babybear"> {product_source = "constrain"} + %felt_const_958139571 = felt.const 958139571 : <"babybear"> {product_source = "constrain"} + %felt_const_883997877 = felt.const 883997877 : <"babybear"> {product_source = "constrain"} + %felt_const_659060556 = felt.const 659060556 : <"babybear"> {product_source = "constrain"} + %felt_const_506948616 = felt.const 506948616 : <"babybear"> {product_source = "constrain"} + %felt_const_430227734 = felt.const 430227734 : <"babybear"> {product_source = "constrain"} + %felt_const_275423344 = felt.const 275423344 : <"babybear"> {product_source = "constrain"} + %felt_const_4094571909 = felt.const 4094571909 : <"babybear"> {product_source = "constrain"} + %felt_const_3600352804 = felt.const 3600352804 : <"babybear"> {product_source = "constrain"} + %felt_const_3516065817 = felt.const 3516065817 : <"babybear"> {product_source = "constrain"} + %felt_const_3345764771 = felt.const 3345764771 : <"babybear"> {product_source = "constrain"} + %felt_const_3259730800 = felt.const 3259730800 : <"babybear"> {product_source = "constrain"} + %felt_const_2820302411 = felt.const 2820302411 : <"babybear"> {product_source = "constrain"} + %felt_const_2730485921 = felt.const 2730485921 : <"babybear"> {product_source = "constrain"} + %felt_const_2456956037 = felt.const 2456956037 : <"babybear"> {product_source = "constrain"} + %felt_const_2177026350 = felt.const 2177026350 : <"babybear"> {product_source = "constrain"} + %felt_const_1986661051 = felt.const 1986661051 : <"babybear"> {product_source = "constrain"} + %felt_const_1695183700 = felt.const 1695183700 : <"babybear"> {product_source = "constrain"} + %felt_const_1396182291 = felt.const 1396182291 : <"babybear"> {product_source = "constrain"} + %felt_const_1294757372 = felt.const 1294757372 : <"babybear"> {product_source = "constrain"} + %felt_const_773529912 = felt.const 773529912 : <"babybear"> {product_source = "constrain"} + %felt_const_666307205 = felt.const 666307205 : <"babybear"> {product_source = "constrain"} + %felt_const_338241895 = felt.const 338241895 : <"babybear"> {product_source = "constrain"} + %felt_const_113926993 = felt.const 113926993 : <"babybear"> {product_source = "constrain"} + %felt_const_3584528711 = felt.const 3584528711 : <"babybear"> {product_source = "constrain"} + %felt_const_3336571891 = felt.const 3336571891 : <"babybear"> {product_source = "constrain"} + %felt_const_3210313671 = felt.const 3210313671 : <"babybear"> {product_source = "constrain"} + %felt_const_2952996808 = felt.const 2952996808 : <"babybear"> {product_source = "constrain"} + %felt_const_2821834349 = felt.const 2821834349 : <"babybear"> {product_source = "constrain"} + %felt_const_2554220882 = felt.const 2554220882 : <"babybear"> {product_source = "constrain"} + %felt_const_1996064986 = felt.const 1996064986 : <"babybear"> {product_source = "constrain"} + %felt_const_1555081692 = felt.const 1555081692 : <"babybear"> {product_source = "constrain"} + %felt_const_1249150122 = felt.const 1249150122 : <"babybear"> {product_source = "constrain"} + %felt_const_770255983 = felt.const 770255983 : <"babybear"> {product_source = "constrain"} + %felt_const_604807628 = felt.const 604807628 : <"babybear"> {product_source = "constrain"} + %felt_const_264347078 = felt.const 264347078 : <"babybear"> {product_source = "constrain"} + %felt_const_4022224774 = felt.const 4022224774 : <"babybear"> {product_source = "constrain"} + %felt_const_3835390401 = felt.const 3835390401 : <"babybear"> {product_source = "constrain"} + %felt_const_3248222580 = felt.const 3248222580 : <"babybear"> {product_source = "constrain"} + %felt_const_2614888103 = felt.const 2614888103 : <"babybear"> {product_source = "constrain"} + %felt_const_2162078206 = felt.const 2162078206 : <"babybear"> {product_source = "constrain"} + %felt_const_1925078388 = felt.const 1925078388 : <"babybear"> {product_source = "constrain"} + %felt_const_1426881987 = felt.const 1426881987 : <"babybear"> {product_source = "constrain"} + %felt_const_607225278 = felt.const 607225278 : <"babybear"> {product_source = "constrain"} + %felt_const_310598401 = felt.const 310598401 : <"babybear"> {product_source = "constrain"} + %felt_const_3624381080 = felt.const 3624381080 : <"babybear"> {product_source = "constrain"} + %felt_const_2870763221 = felt.const 2870763221 : <"babybear"> {product_source = "constrain"} + %felt_const_2453635748 = felt.const 2453635748 : <"babybear"> {product_source = "constrain"} + %felt_const_1508970993 = felt.const 1508970993 : <"babybear"> {product_source = "constrain"} + %felt_const_961987163 = felt.const 961987163 : <"babybear"> {product_source = "constrain"} + %felt_const_3921009573 = felt.const 3921009573 : <"babybear"> {product_source = "constrain"} + %felt_const_3049323471 = felt.const 3049323471 : <"babybear"> {product_source = "constrain"} + %felt_const_1899447441 = felt.const 1899447441 : <"babybear"> {product_source = "constrain"} + %felt_const_1116352408 = felt.const 1116352408 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_1116352408 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_1899447441 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_3049323471 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_3921009573 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_961987163 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_1508970993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_2453635748 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_2870763221 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_3624381080 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_310598401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_607225278 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_1426881987 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_1925078388 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_2162078206 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_2614888103 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_3248222580 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_3835390401 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_4022224774 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_264347078 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_604807628 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_770255983 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_1249150122 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_1555081692 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_1996064986 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_2554220882 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_2821834349 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_2952996808 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_3210313671 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_3336571891 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_3584528711 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_113926993 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_338241895 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_666307205 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_773529912 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_1294757372 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_1396182291 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_1695183700 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_1986661051 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_2177026350 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_2456956037 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_2730485921 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_2820302411 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_3259730800 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_3345764771 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_3516065817 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_3600352804 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_4094571909 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_275423344 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_430227734 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_506948616 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_659060556 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_883997877 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_958139571 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_1322822218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_1537002063 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_1747873779 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_1955562222 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_2024104815 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_2227730452 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_2361852424 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_2428436474 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_2756734187 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_3204031479 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_3329325298 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.shr %felt_const_3624381080, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @A_1 { + struct.def @A_1 { + struct.member @h0 : !struct.type<@K_0::@K_0<[]>> + struct.member @h0$inputs : !pod.type<[]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@A_1::@A_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@A_1::@A_1<[]>> {product_source = "compute"} + %pod = pod.new : <[]> {product_source = "compute"} + %0 = function.call @K_0::@K_0::@product() : () -> !struct.type<@K_0::@K_0<[]>> + %1 = function.call @K_0::@K_0::@compute() : () -> !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + %pod_0 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@K_0::@K_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %2 = struct.readm %self[@h0] : <@A_1::@A_1<[]>>, !struct.type<@K_0::@K_0<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@h0$inputs] : <@A_1::@A_1<[]>>, !pod.type<[]> {product_source = "constrain"} + %4:4 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %6 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@K_0::@K_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %8[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %arg3, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %arg2, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %2[@out] : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %arg5, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %arg4, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %12, %13, %19, %20 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@h0$inputs] = %pod_1 : <@A_1::@A_1<[]>>, !pod.type<[]> {product_source = "compute"} + %5 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@K_0::@K_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + struct.writem %self[@h0] = %5 : <@A_1::@A_1<[]>>, !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + constrain.eq %4#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.call @K_0::@K_0::@constrain(%2) : (!struct.type<@K_0::@K_0<[]>>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@A_1::@A_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@A_1::@A_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@A_1::@A_1<[]>> {product_source = "compute"} + %pod = pod.new : <[]> {product_source = "compute"} + %0 = function.call @K_0::@K_0::@compute() : () -> !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + %pod_0 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@K_0::@K_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %1:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@K_0::@K_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@h0$inputs] = %pod_1 : <@A_1::@A_1<[]>>, !pod.type<[]> {product_source = "compute"} + %2 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@K_0::@K_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + struct.writem %self[@h0] = %2 : <@A_1::@A_1<[]>>, !struct.type<@K_0::@K_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@A_1::@A_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@A_1::@A_1<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@h0] : <@A_1::@A_1<[]>>, !struct.type<@K_0::@K_0<[]>> {product_source = "constrain"} + %1 = struct.readm %arg0[@h0$inputs] : <@A_1::@A_1<[]>>, !pod.type<[]> {product_source = "constrain"} + %2:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %0[@out] : <@K_0::@K_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %4[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %arg4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.call @K_0::@K_0::@constrain(%0) : (!struct.type<@K_0::@K_0<[]>>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/decryptMultiple_test.llzk b/examples/circom-demo/decryptMultiple_test.llzk new file mode 100644 index 0000000..ab49f63 --- /dev/null +++ b/examples/circom-demo/decryptMultiple_test.llzk @@ -0,0 +1,1108 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@DecryptBits_1::@DecryptBits_1<[]>>} { + poly.template @MiMC7_0 { + struct.def @MiMC7_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<91 x !felt.type<"babybear">> + struct.member @t4 : !array.type<91 x !felt.type<"babybear">> + struct.member @t6 : !array.type<91 x !felt.type<"babybear">> + struct.member @t7 : !array.type<90 x !felt.type<"babybear">> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@MiMC7_0::@MiMC7_0<[]>> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<90 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !felt.type<"babybear"> + %nondet_4 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = scf.for %arg2 = %c0 to %c91 step %c1 iter_args(%arg3 = %nondet_3) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = scf.if %2 -> (!felt.type<"babybear">) { + %20 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } else { + %20 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet_1[%21] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg1, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %nondet_4[%24] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %23, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } + %4 = felt.mul %3, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%5] = %4 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %nondet_2[%8] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%11] = %10 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %nondet_2[%14] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%17] = %16 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = bool.cmp lt(%1, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.if %18 -> (!felt.type<"babybear">) { + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%23] = %22 : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %arg3 : !felt.type<"babybear"> + } else { + %20 = array.read %nondet_0[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %20, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %22 : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + scf.yield %19 : !felt.type<"babybear"> + } + struct.writem %self[@t2] = %nondet_2 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t4] = %nondet : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t6] = %nondet_0 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t7] = %nondet_1 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + function.return %self : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@t2] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@t4] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@t6] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@t7] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c91 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp eq(%5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %26 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } else { + %26 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %4[%27] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.add %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %5 : !felt.type<"babybear"> + %31 = array.read %nondet[%30] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %29, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %32 : !felt.type<"babybear"> + } + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %1[%9] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %1[%13] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %5 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = array.read %2[%18] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %5 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %19, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %3[%23] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.cmp lt(%5, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %25 { + %26 = cast.toindex %5 : !felt.type<"babybear"> + %27 = array.read %3[%26] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %27, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %5 : !felt.type<"babybear"> + %30 = array.read %4[%29] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %26 = array.read %3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %26, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.add %27, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @DecryptBits_1 { + struct.def @DecryptBits_1 { + struct.member @out : !array.type<1000 x !felt.type<"babybear">> {llzk.pub} + struct.member @hasher : !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.member @hasher$inputs : !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<1001 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@DecryptBits_1::@DecryptBits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1000 = arith.constant {product_source = "compute"} 1000 : index + %self = struct.new : <@DecryptBits_1::@DecryptBits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %3 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %3 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array_0[%4] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %5[@x_in] = %arg1 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%6] = %5 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array[%7] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %8[@count] = %10 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %31 = pod.read %5[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %5[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @MiMC7_0::@MiMC7_0::@compute(%31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %8[@comp] = %33 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%34] = %8 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %arg0[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_0[%14] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %15[@k] = %13 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%16] = %15 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array[%17] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %31 = pod.read %15[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %15[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @MiMC7_0::@MiMC7_0::@compute(%31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %18[@comp] = %33 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%34] = %18 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %22 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array[%25] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %28 = struct.readm %27[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %24, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%30] = %29 : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %array_0 : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %3 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + array.write %array_1[%arg2] = %4 : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher] = %array_1 : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@hasher] : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@hasher$inputs] : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %2[%4] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = pod.read %5[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg0[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %7, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %2[%9] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%13] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %1[%15] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%19] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %3 = array.read %1[%arg2] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%3, %5, %6) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@DecryptBits_1::@DecryptBits_1<[]>> + } + function.def @compute(%arg0: !array.type<1001 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@DecryptBits_1::@DecryptBits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1000 = arith.constant {product_source = "compute"} 1000 : index + %self = struct.new : <@DecryptBits_1::@DecryptBits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %0 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %0 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array_0[%1] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %2[@x_in] = %arg1 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%3] = %2 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %4 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%4] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %5[@count] = %7 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %28 = pod.read %2[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %2[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = function.call @MiMC7_0::@MiMC7_0::@compute(%28, %29) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %5[@comp] = %30 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%31] = %5 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %9 = array.read %arg0[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%11] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %12[@k] = %10 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%13] = %12 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %14 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array[%14] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %28 = pod.read %12[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %12[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = function.call @MiMC7_0::@MiMC7_0::@compute(%28, %29) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %15[@comp] = %30 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%31] = %15 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %19 = felt.add %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%20] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array[%22] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.sub %21, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%27] = %26 : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %array_0 : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %0 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + array.write %array_1[%arg2] = %1 : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher] = %array_1 : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@DecryptBits_1::@DecryptBits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@DecryptBits_1::@DecryptBits_1<[]>>, %arg1: !array.type<1001 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c1000 = arith.constant {product_source = "constrain"} 1000 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@hasher] : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@hasher$inputs] : <@DecryptBits_1::@DecryptBits_1<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c1000 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %2[%4] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = pod.read %5[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %7, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %2[%9] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%13] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %1[%15] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%19] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c1000 step %c1 { + %3 = array.read %1[%arg3] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg3] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%3, %5, %6) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/decrypt_test.llzk b/examples/circom-demo/decrypt_test.llzk new file mode 100644 index 0000000..e11ac3b --- /dev/null +++ b/examples/circom-demo/decrypt_test.llzk @@ -0,0 +1,1108 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Decrypt_1::@Decrypt_1<[]>>} { + poly.template @MiMC7_0 { + struct.def @MiMC7_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<91 x !felt.type<"babybear">> + struct.member @t4 : !array.type<91 x !felt.type<"babybear">> + struct.member @t6 : !array.type<91 x !felt.type<"babybear">> + struct.member @t7 : !array.type<90 x !felt.type<"babybear">> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@MiMC7_0::@MiMC7_0<[]>> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<90 x !felt.type<"babybear">> + %nondet_4 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = scf.for %arg2 = %c0 to %c91 step %c1 iter_args(%arg3 = %nondet_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = scf.if %2 -> (!felt.type<"babybear">) { + %20 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } else { + %20 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet_3[%21] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg1, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %nondet_4[%24] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %23, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } + %4 = felt.mul %3, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%5] = %4 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %nondet_2[%8] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%11] = %10 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %nondet_1[%12] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %nondet_2[%14] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%17] = %16 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = bool.cmp lt(%1, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.if %18 -> (!felt.type<"babybear">) { + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = array.read %nondet[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_3[%23] = %22 : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %arg3 : !felt.type<"babybear"> + } else { + %20 = array.read %nondet[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %20, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %22 : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + scf.yield %19 : !felt.type<"babybear"> + } + struct.writem %self[@t2] = %nondet_2 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t4] = %nondet_1 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t6] = %nondet : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t7] = %nondet_3 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + function.return %self : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@t2] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@t4] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@t6] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@t7] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c91 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp eq(%5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %26 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } else { + %26 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %4[%27] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.add %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %5 : !felt.type<"babybear"> + %31 = array.read %nondet[%30] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %29, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %32 : !felt.type<"babybear"> + } + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %1[%9] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %1[%13] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %5 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = array.read %2[%18] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %5 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %19, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %3[%23] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.cmp lt(%5, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %25 { + %26 = cast.toindex %5 : !felt.type<"babybear"> + %27 = array.read %3[%26] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %27, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %5 : !felt.type<"babybear"> + %30 = array.read %4[%29] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %26 = array.read %3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %26, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.add %27, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @Decrypt_1 { + struct.def @Decrypt_1 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + struct.member @hasher : !array.type<5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.member @hasher$inputs : !array.type<5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<6 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@Decrypt_1::@Decrypt_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Decrypt_1::@Decrypt_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %3 : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array_0[%4] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %5[@xin] = %arg1 : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%6] = %5 : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array[%7] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %8[@count] = %10 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %31 = pod.read %5[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %5[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @MiMC7_0::@MiMC7_0::@compute(%31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %8[@comp] = %33 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%34] = %8 : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_0[%14] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %15[@k] = %13 : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%16] = %15 : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array[%17] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %31 = pod.read %15[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %15[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @MiMC7_0::@MiMC7_0::@compute(%31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %18[@comp] = %33 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %34 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%34] = %18 : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %22 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array[%25] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %28 = struct.readm %27[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %24, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%30] = %29 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %array_0 : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + array.write %array_1[%arg2] = %4 : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher] = %array_1 : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@hasher] : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@hasher$inputs] : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %2[%4] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = pod.read %5[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %7, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %2[%9] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%13] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %1[%15] : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%19] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = array.read %1[%arg2] : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%3, %5, %6) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Decrypt_1::@Decrypt_1<[]>> + } + function.def @compute(%arg0: !array.type<6 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@Decrypt_1::@Decrypt_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Decrypt_1::@Decrypt_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %0 : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array_0[%1] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %2[@xin] = %arg1 : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%3] = %2 : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %4 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%4] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %5[@count] = %7 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %28 = pod.read %2[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %2[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = function.call @MiMC7_0::@MiMC7_0::@compute(%28, %29) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %5[@comp] = %30 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%31] = %5 : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %9 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%11] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %12[@k] = %10 : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%13] = %12 : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %14 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array[%14] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %28 = pod.read %12[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %12[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = function.call @MiMC7_0::@MiMC7_0::@compute(%28, %29) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %15[@comp] = %30 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%31] = %15 : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %19 = felt.add %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%20] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array[%22] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.sub %21, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%27] = %26 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %array_0 : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + array.write %array_1[%arg2] = %1 : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher] = %array_1 : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Decrypt_1::@Decrypt_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Decrypt_1::@Decrypt_1<[]>>, %arg1: !array.type<6 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@hasher] : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@hasher$inputs] : <@Decrypt_1::@Decrypt_1<[]>>, !array.type<5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %2[%4] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = pod.read %5[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %7, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %2[%9] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%13] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %1[%15] : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%19] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %3 = array.read %1[%arg3] : <5 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg3] : <5 x !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@xin] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@k] : <[@xin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%3, %5, %6) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/edwards2montgomery.llzk b/examples/circom-demo/edwards2montgomery.llzk new file mode 100644 index 0000000..2dcb00e --- /dev/null +++ b/examples/circom-demo/edwards2montgomery.llzk @@ -0,0 +1,78 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>>} { + poly.template @Edwards2Montgomery_0 { + struct.def @Edwards2Montgomery_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.div %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.div %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.sub %felt_const_1, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %8[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.div %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.div %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Edwards2Montgomery_0::@Edwards2Montgomery_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.sub %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/encryptMultiple_test.llzk b/examples/circom-demo/encryptMultiple_test.llzk new file mode 100644 index 0000000..16f686b --- /dev/null +++ b/examples/circom-demo/encryptMultiple_test.llzk @@ -0,0 +1,1374 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@EncryptBits_2::@EncryptBits_2<[]>>} { + poly.template @MiMC7_0 { + struct.def @MiMC7_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<91 x !felt.type<"babybear">> + struct.member @t4 : !array.type<91 x !felt.type<"babybear">> + struct.member @t6 : !array.type<91 x !felt.type<"babybear">> + struct.member @t7 : !array.type<90 x !felt.type<"babybear">> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@MiMC7_0::@MiMC7_0<[]>> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<90 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !felt.type<"babybear"> + %nondet_4 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = scf.for %arg2 = %c0 to %c91 step %c1 iter_args(%arg3 = %nondet_3) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = scf.if %2 -> (!felt.type<"babybear">) { + %20 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } else { + %20 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet_2[%21] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg1, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %nondet_4[%24] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %23, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } + %4 = felt.mul %3, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%5] = %4 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%11] = %10 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %nondet_0[%14] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%17] = %16 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = bool.cmp lt(%1, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.if %18 -> (!felt.type<"babybear">) { + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = array.read %nondet_1[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%23] = %22 : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %arg3 : !felt.type<"babybear"> + } else { + %20 = array.read %nondet_1[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %20, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %22 : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + scf.yield %19 : !felt.type<"babybear"> + } + struct.writem %self[@t2] = %nondet_0 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t4] = %nondet : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t6] = %nondet_1 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t7] = %nondet_2 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + function.return %self : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@t2] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@t4] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@t6] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@t7] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c91 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp eq(%5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %26 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } else { + %26 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %4[%27] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.add %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %5 : !felt.type<"babybear"> + %31 = array.read %nondet[%30] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %29, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %32 : !felt.type<"babybear"> + } + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %1[%9] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %1[%13] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %5 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = array.read %2[%18] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %5 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %19, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %3[%23] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.cmp lt(%5, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %25 { + %26 = cast.toindex %5 : !felt.type<"babybear"> + %27 = array.read %3[%26] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %27, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %5 : !felt.type<"babybear"> + %30 = array.read %4[%29] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %26 = array.read %3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %26, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.add %27, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @MultiMiMC7_1 { + struct.def @MultiMiMC7_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @r : !array.type<1001 x !felt.type<"babybear">> + struct.member @mims : !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.member @mims$inputs : !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<1000 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c1000 = arith.constant 1000 : index + %self = struct.new : <@MultiMiMC7_1::@MultiMiMC7_1<[]>> + %nondet = llzk.nondet : !array.type<1001 x !felt.type<"babybear">> + %array = array.new : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c1000 step %c1 { + %1 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %1 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + array.write %nondet[%c0] = %arg1 : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c1000 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %array_0[%4] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + pod.write %5[@x_in] = %3 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_0[%6] = %5 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %array[%7] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %9 = pod.read %8[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %8[@count] = %10 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %34 = pod.read %5[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %35 = pod.read %5[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %36 = function.call @MiMC7_0::@MiMC7_0::@compute(%34, %35) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> + pod.write %8[@comp] = %36 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %37 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array[%37] = %8 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + } + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %array_0[%14] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + pod.write %15[@k] = %13 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_0[%16] = %15 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = array.read %array[%17] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %34 = pod.read %15[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %35 = pod.read %15[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %36 = function.call @MiMC7_0::@MiMC7_0::@compute(%34, %35) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> + pod.write %18[@comp] = %36 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %37 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array[%37] = %18 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + } + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = array.read %nondet[%22] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %arg0[%24] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %23, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = array.read %array[%27] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %30 = struct.readm %29[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %31 = felt.add %26, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %32 : !felt.type<"babybear"> + array.write %nondet[%33] = %31 : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = array.read %nondet[%c1000] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mims$inputs] = %array_0 : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + %array_1 = array.new : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + scf.for %arg2 = %c0 to %c1000 step %c1 { + %1 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + array.write %array_1[%arg2] = %2 : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + struct.writem %self[@mims] = %array_1 : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.writem %self[@r] = %nondet : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1001 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, %arg1: !array.type<1000 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c1000 = arith.constant 1000 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@r] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1001 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@mims] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + %3 = struct.readm %arg0[@mims$inputs] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + %4 = array.read %1[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c1000 step %c1 { + %6 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %6 : !felt.type<"babybear"> + %10 = array.read %3[%9] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %11 = pod.read %10[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %6 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = array.read %3[%14] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %16 = pod.read %15[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %6 : !felt.type<"babybear"> + %18 = array.read %1[%17] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %6 : !felt.type<"babybear"> + %20 = array.read %arg1[%19] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %6 : !felt.type<"babybear"> + %23 = array.read %2[%22] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %24 = struct.readm %23[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %25 = felt.add %21, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %1[%27] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c1000] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c1000 step %c1 { + %6 = array.read %2[%arg3] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %7 = array.read %3[%arg3] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %8 = pod.read %7[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = pod.read %7[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @MiMC7_0::@MiMC7_0::@constrain(%6, %8, %9) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @EncryptBits_2 { + struct.def @EncryptBits_2 { + struct.member @out : !array.type<1001 x !felt.type<"babybear">> {llzk.pub} + struct.member @mimc : !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> + struct.member @mimc$inputs : !pod.type<[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> + struct.member @hasher : !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.member @hasher$inputs : !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<1000 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@EncryptBits_2::@EncryptBits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1000 = arith.constant {product_source = "compute"} 1000 : index + %c1001 = arith.constant {product_source = "compute"} 1001 : index + %self = struct.new : <@EncryptBits_2::@EncryptBits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1001 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1001 } : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %16[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %16 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_0[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %19 : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod_0[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %26 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%24, %25) : (!array.type<1000 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %26 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_0[@k] = %felt_const_0 : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %16 = pod.read %pod_0[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_0[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %18 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%16, %17) : (!array.type<1000 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %18 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %4 : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_1[%17] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %18[@x_in] = %arg1 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%19] = %18 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%20] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %44 = pod.read %18[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %18[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @MiMC7_0::@MiMC7_0::@compute(%44, %45) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %21[@comp] = %46 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %47 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%47] = %21 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = array.read %nondet[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_1[%27] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %28[@k] = %26 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%29] = %28 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %30 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array[%30] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %44 = pod.read %28[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %28[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @MiMC7_0::@MiMC7_0::@compute(%44, %45) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %31[@comp] = %46 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %47 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%47] = %31 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %35 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array[%37] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %36, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.add %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%43] = %41 : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %array_1 : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %17 = pod.read %16[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %17 : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher] = %array_2 : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + struct.writem %self[@mimc$inputs] = %pod_0 : <@EncryptBits_2::@EncryptBits_2<[]>>, !pod.type<[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@mimc] = %5 : <@EncryptBits_2::@EncryptBits_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1001 x !felt.type<"babybear">> {product_source = "compute"} + %6 = struct.readm %self[@out] : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1001 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = struct.readm %self[@mimc] : <@EncryptBits_2::@EncryptBits_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@mimc$inputs] : <@EncryptBits_2::@EncryptBits_2<[]>>, !pod.type<[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %9 = struct.readm %self[@hasher] : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "constrain"} + %10 = struct.readm %self[@hasher$inputs] : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %8[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = pod.read %8[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %7[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %6[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %10[%17] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %6[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %10[%22] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %24 = pod.read %23[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg0[%25] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %9[%27] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %26, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %6[%32] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %16 = array.read %9[%arg2] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %17 = array.read %10[%arg2] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %17[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%16, %18, %19) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %14 = pod.read %8[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = pod.read %8[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MultiMiMC7_1::@MultiMiMC7_1::@constrain(%7, %14, %15) : (!struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1000 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@EncryptBits_2::@EncryptBits_2<[]>> + } + function.def @compute(%arg0: !array.type<1000 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@EncryptBits_2::@EncryptBits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1000 = arith.constant {product_source = "compute"} 1000 : index + %c1001 = arith.constant {product_source = "compute"} 1001 : index + %self = struct.new : <@EncryptBits_2::@EncryptBits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1001 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1001 } : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %6 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %6[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %6 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%7] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_0[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %9 : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %12 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod_0[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%14, %15) : (!array.type<1000 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_0[@k] = %felt_const_0 : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %6 = pod.read %pod_0[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_0[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%6, %7) : (!array.type<1000 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %8 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %4 : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array_1[%7] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %8[@x_in] = %arg1 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%9] = %8 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array[%10] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %11[@count] = %13 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %34 = pod.read %8[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %35 = pod.read %8[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = function.call @MiMC7_0::@MiMC7_0::@compute(%34, %35) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %11[@comp] = %36 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %37 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%37] = %11 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %15 = array.read %nondet[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %15, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_1[%17] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %18[@k] = %16 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%19] = %18 : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %20 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%20] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %34 = pod.read %18[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %35 = pod.read %18[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = function.call @MiMC7_0::@MiMC7_0::@compute(%34, %35) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %21[@comp] = %36 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %37 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%37] = %21 : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%25] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array[%27] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %26, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%33] = %31 : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %array_1 : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c1000 step %c1 { + %6 = array.read %array[%arg2] : <1000 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %7 : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@hasher] = %array_2 : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "compute"} + struct.writem %self[@mimc$inputs] = %pod_0 : <@EncryptBits_2::@EncryptBits_2<[]>>, !pod.type<[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@mimc] = %5 : <@EncryptBits_2::@EncryptBits_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1001 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@EncryptBits_2::@EncryptBits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@EncryptBits_2::@EncryptBits_2<[]>>, %arg1: !array.type<1000 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c1000 = arith.constant {product_source = "constrain"} 1000 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1001 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@mimc] : <@EncryptBits_2::@EncryptBits_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mimc$inputs] : <@EncryptBits_2::@EncryptBits_2<[]>>, !pod.type<[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@hasher] : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@hasher$inputs] : <@EncryptBits_2::@EncryptBits_2<[]>>, !array.type<1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c1000 step %c1 { + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg1[%11] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %2[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = pod.read %2[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %1[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c1000 step %c1 { + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %4[%11] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%c0] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %4[%16] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <1000 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %3[%21] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %23 = struct.readm %22[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.add %20, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %0[%26] : <1001 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c1000 step %c1 { + %10 = array.read %3[%arg3] : <1000 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %11 = array.read %4[%arg3] : <1000 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = pod.read %11[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %11[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%10, %12, %13) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1000 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %2[@k] : <[@in: !array.type<1000 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MultiMiMC7_1::@MultiMiMC7_1::@constrain(%1, %8, %9) : (!struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1000 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/encrypt_test.llzk b/examples/circom-demo/encrypt_test.llzk new file mode 100644 index 0000000..d4f5a5b --- /dev/null +++ b/examples/circom-demo/encrypt_test.llzk @@ -0,0 +1,1210 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Encrypt_2::@Encrypt_2<[]>>} { + poly.template @MiMC7_0 { + struct.def @MiMC7_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<91 x !felt.type<"babybear">> + struct.member @t4 : !array.type<91 x !felt.type<"babybear">> + struct.member @t6 : !array.type<91 x !felt.type<"babybear">> + struct.member @t7 : !array.type<90 x !felt.type<"babybear">> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@MiMC7_0::@MiMC7_0<[]>> + %nondet = llzk.nondet : !array.type<90 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + %nondet_4 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = scf.for %arg2 = %c0 to %c91 step %c1 iter_args(%arg3 = %nondet_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = scf.if %2 -> (!felt.type<"babybear">) { + %20 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } else { + %20 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet[%21] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg1, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %nondet_4[%24] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %23, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } + %4 = felt.mul %3, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%5] = %4 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %nondet_1[%8] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_3[%11] = %10 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %nondet_3[%12] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %nondet_1[%14] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%17] = %16 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = bool.cmp lt(%1, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.if %18 -> (!felt.type<"babybear">) { + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = array.read %nondet_2[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %arg3 : !felt.type<"babybear"> + } else { + %20 = array.read %nondet_2[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %20, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %22 : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + scf.yield %19 : !felt.type<"babybear"> + } + struct.writem %self[@t2] = %nondet_1 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t4] = %nondet_3 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t6] = %nondet_2 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + struct.writem %self[@t7] = %nondet : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + function.return %self : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> + %felt_const_90 = felt.const 90 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@t2] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@t4] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@t6] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@t7] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c91 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp eq(%5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %26 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } else { + %26 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %4[%27] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.add %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %5 : !felt.type<"babybear"> + %31 = array.read %nondet[%30] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %29, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %32 : !felt.type<"babybear"> + } + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %1[%9] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %1[%13] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %5 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = array.read %2[%18] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %5 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %19, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %3[%23] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.cmp lt(%5, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %25 { + %26 = cast.toindex %5 : !felt.type<"babybear"> + %27 = array.read %3[%26] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %27, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %5 : !felt.type<"babybear"> + %30 = array.read %4[%29] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %26 = array.read %3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %26, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.add %27, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @MultiMiMC7_1 { + struct.def @MultiMiMC7_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @r : !array.type<2 x !felt.type<"babybear">> + struct.member @mims : !array.type<1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.member @mims$inputs : !array.type<1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@MultiMiMC7_1::@MultiMiMC7_1<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + array.write %nondet[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %4 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%4) + } do { + %4 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = array.read %array_0[%c0] : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + pod.write %5[@x_in] = %4 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %5 : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %6 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.subi %7, %c1 : index + pod.write %6[@count] = %8 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.cmpi eq, %8, %c0 : index + scf.if %9 { + %23 = pod.read %5[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %24 = pod.read %5[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %25 = function.call @MiMC7_0::@MiMC7_0::@compute(%23, %24) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> + pod.write %6[@comp] = %25 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + array.write %array[%c0] = %6 : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + } + %10 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %array_0[%c0] : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + pod.write %11[@k] = %10 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %11 : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %12 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.subi %13, %c1 : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index + %15 = arith.cmpi eq, %14, %c0 : index + scf.if %15 { + %23 = pod.read %11[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %24 = pod.read %11[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %25 = function.call @MiMC7_0::@MiMC7_0::@compute(%23, %24) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> + pod.write %12[@comp] = %25 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + array.write %array[%c0] = %12 : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + } + %16 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.add %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %21 = struct.readm %20[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %22 = felt.add %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %1 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mims$inputs] = %array_0 : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + %array_1 = array.new : <1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + %2 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + array.write %array_1[%c0] = %3 : <1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + struct.writem %self[@mims] = %array_1 : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + struct.writem %self[@r] = %nondet : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@r] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<2 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@mims] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>> + %3 = struct.readm %arg0[@mims$inputs] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + %4 = array.read %1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %10 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%10) + } do { + %10 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %3[%c0] : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %12 = pod.read %11[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = array.read %1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = array.read %3[%c0] : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %15 = pod.read %14[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.add %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = array.read %2[%c0] : <1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %20 = struct.readm %19[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %22, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %2[%c0] : <1 x !struct.type<@MiMC7_0::@MiMC7_0<[]>>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> + %7 = array.read %3[%c0] : <1 x !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + %8 = pod.read %7[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = pod.read %7[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @MiMC7_0::@MiMC7_0::@constrain(%6, %8, %9) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Encrypt_2 { + struct.def @Encrypt_2 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @hasher : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + struct.member @hasher$inputs : !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> + struct.member @mimc : !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> + struct.member @mimc$inputs : !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@Encrypt_2::@Encrypt_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Encrypt_2::@Encrypt_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %0 = pod.read %pod_2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %0 : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %41 = pod.read %pod_2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_2[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%41, %42) : (!array.type<1 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %43 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_2[@k] = %felt_const_0 : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %5 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %41 = pod.read %pod_2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_2[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%41, %42) : (!array.type<1 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %43 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %8 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@x_in] = %arg1 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %41 = pod.read %pod_0[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_0[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = function.call @MiMC7_0::@MiMC7_0::@compute(%41, %42) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %43 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@k] = %12 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %41 = pod.read %pod_0[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_0[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %43 = function.call @MiMC7_0::@MiMC7_0::@compute(%41, %42) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %43 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %arg0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %18 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %pod_0 : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + struct.writem %self[@hasher] = %19 : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + struct.writem %self[@mimc$inputs] = %pod_2 : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %20 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@mimc] = %20 : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Encrypt_2::@Encrypt_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = struct.readm %self[@out] : <@Encrypt_2::@Encrypt_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = struct.readm %self[@hasher] : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %23 = struct.readm %self[@hasher$inputs] : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %24 = struct.readm %self[@mimc] : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "constrain"} + %25 = struct.readm %self[@mimc$inputs] : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %26[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %25[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %24[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %21[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = pod.read %23[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %21[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %23[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = struct.readm %22[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %arg0, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %21[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = pod.read %23[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %23[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%22, %37, %38) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + %39 = pod.read %25[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = pod.read %25[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MultiMiMC7_1::@MultiMiMC7_1::@constrain(%24, %39, %40) : (!struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Encrypt_2::@Encrypt_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@Encrypt_2::@Encrypt_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Encrypt_2::@Encrypt_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %0 = pod.read %pod_2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %0 : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %21 = pod.read %pod_2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_2[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%21, %22) : (!array.type<1 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_2[@k] = %felt_const_0 : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %5 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %21 = pod.read %pod_2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_2[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @MultiMiMC7_1::@MultiMiMC7_1::@compute(%21, %22) : (!array.type<1 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %8 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@x_in] = %arg1 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %21 = pod.read %pod_0[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_0[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @MiMC7_0::@MiMC7_0::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@k] = %12 : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %21 = pod.read %pod_0[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_0[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @MiMC7_0::@MiMC7_0::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %arg0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %18 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@hasher$inputs] = %pod_0 : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + struct.writem %self[@hasher] = %19 : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + struct.writem %self[@mimc$inputs] = %pod_2 : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "compute"} + %20 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@mimc] = %20 : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Encrypt_2::@Encrypt_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Encrypt_2::@Encrypt_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Encrypt_2::@Encrypt_2<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Encrypt_2::@Encrypt_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@hasher] : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MiMC7_0::@MiMC7_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@hasher$inputs] : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@mimc] : <@Encrypt_2::@Encrypt_2<[]>>, !struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@mimc$inputs] : <@Encrypt_2::@Encrypt_2<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %4[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %3[@out] : <@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %2[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %1[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %arg1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@x_in] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %2[@k] : <[@x_in: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMC7_0::@MiMC7_0::@constrain(%1, %16, %17) : (!struct.type<@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + %18 = pod.read %4[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = pod.read %4[@k] : <[@in: !array.type<1 x !felt.type<"babybear">>, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MultiMiMC7_1::@MultiMiMC7_1::@constrain(%3, %18, %19) : (!struct.type<@MultiMiMC7_1::@MultiMiMC7_1<[]>>, !array.type<1 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/greatereqthan.llzk b/examples/circom-demo/greatereqthan.llzk new file mode 100644 index 0000000..00d4e01 --- /dev/null +++ b/examples/circom-demo/greatereqthan.llzk @@ -0,0 +1,348 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@GreaterEqThan_2::@GreaterEqThan_2<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<33 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c33 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterEqThan_2 { + struct.def @GreaterEqThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterEqThan_2::@GreaterEqThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterEqThan_2::@GreaterEqThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @LessThan_1::@LessThan_1::@product(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %28 = function.call @LessThan_1::@LessThan_1::@compute(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @LessThan_1::@LessThan_1::@compute(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %12 : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %13 : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %self[@lt] : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@lt$inputs] : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %15[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%15, %25) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterEqThan_2::@GreaterEqThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterEqThan_2::@GreaterEqThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterEqThan_2::@GreaterEqThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %12 : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %13 : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterEqThan_2::@GreaterEqThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterEqThan_2::@GreaterEqThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterEqThan_2::@GreaterEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %11) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/greaterthan.llzk b/examples/circom-demo/greaterthan.llzk new file mode 100644 index 0000000..eb3d030 --- /dev/null +++ b/examples/circom-demo/greaterthan.llzk @@ -0,0 +1,341 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<33 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c33 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_2 { + struct.def @GreaterThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %26 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %23) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %10) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/import_manifest.csv b/examples/circom-demo/import_manifest.csv new file mode 100644 index 0000000..be171d6 --- /dev/null +++ b/examples/circom-demo/import_manifest.csv @@ -0,0 +1,230 @@ +Benchmark,Source File,Optimized File,Root Struct,Preprocess Result,Time Seconds,Message +AveragePooling2D_stride_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/AveragePooling2D_stride_test_llzk/AveragePooling2D_stride_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/AveragePooling2D_stride_test.llzk,AveragePooling2D_2,success,0.193133, +AveragePooling2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/AveragePooling2D_test_llzk/AveragePooling2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/AveragePooling2D_test.llzk,AveragePooling2D_2,success,0.100781, +BatchNormalization_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/BatchNormalization_test_llzk/BatchNormalization_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/BatchNormalization_test.llzk,BatchNormalization2D_0,success,0.056640, +Conv1D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Conv1D_test_llzk/Conv1D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Conv1D_test.llzk,Conv1D_3,success,0.131240, +Conv2D_stride_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Conv2D_stride_test_llzk/Conv2D_stride_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Conv2D_stride_test.llzk,Conv2D_3,success,0.166751, +Conv2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Conv2D_test_llzk/Conv2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Conv2D_test.llzk,Conv2D_3,success,0.166621, +Dense_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Dense_test_llzk/Dense_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Dense_test.llzk,Dense_3,success,0.095087, +Flatten2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Flatten2D_test_llzk/Flatten2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Flatten2D_test.llzk,Flatten2D_0,success,0.055048, +GlobalAveragePooling2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/GlobalAveragePooling2D_test_llzk/GlobalAveragePooling2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/GlobalAveragePooling2D_test.llzk,GlobalAveragePooling2D_2,success,0.081431, +GlobalMaxPooling2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/GlobalMaxPooling2D_test_llzk/GlobalMaxPooling2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/GlobalMaxPooling2D_test.llzk,GlobalMaxPooling2D_5,success,0.130368, +IsNegative_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/IsNegative_test_llzk/IsNegative_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/IsNegative_test.llzk,IsNegative_4,success,0.083048, +IsPositive_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/IsPositive_test_llzk/IsPositive_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/IsPositive_test.llzk,IsPositive_4,success,0.082629, +MaxPooling2D_stride_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/MaxPooling2D_stride_test_llzk/MaxPooling2D_stride_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/MaxPooling2D_stride_test.llzk,MaxPooling2D_5,success,0.113755, +MaxPooling2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/MaxPooling2D_test_llzk/MaxPooling2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/MaxPooling2D_test.llzk,MaxPooling2D_5,success,0.113002, +Max_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Max_test_llzk/Max_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Max_test.llzk,Max_4,success,0.090770, +Num2Bits,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/Num2Bits_llzk/Num2Bits.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/Num2Bits.llzk,Num2Bits_0,success,0.050024, +ReLU_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/ReLU_test_llzk/ReLU_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/ReLU_test.llzk,relu_test_6,success,0.087024, +SumPooling2D_stride_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/SumPooling2D_stride_test_llzk/SumPooling2D_stride_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_stride_test.llzk,SumPooling2D_1,success,0.081563, +SumPooling2D_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/SumPooling2D_test_llzk/SumPooling2D_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_test.llzk,SumPooling2D_1,success,0.081708, +aes_256_ctr_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/aes_256_ctr_test_llzk/aes_256_ctr_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/aes_256_ctr_test.llzk,AES256CTR_8,success,1.214869, +aes_256_encrypt_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/aes_256_encrypt_test_llzk/aes_256_encrypt_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/aes_256_encrypt_test.llzk,AES256Encrypt_6,success,1.022826, +aes_256_key_expansion_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/aes_256_key_expansion_test_llzk/aes_256_key_expansion_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/aes_256_key_expansion_test.llzk,AES256KeyExpansion_3,success,0.813749, +aliascheck_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/aliascheck_test_llzk/aliascheck_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/aliascheck_test.llzk,AliasCheck_2,success,0.074434, +babyadd_tester,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/babyadd_tester_llzk/babyadd_tester.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/babyadd_tester.llzk,BabyAdd_0,success,0.052204, +babycheck_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/babycheck_test_llzk/babycheck_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/babycheck_test.llzk,BabyCheck_0,success,0.049092, +binsub_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/binsub_test_llzk/binsub_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/binsub_test.llzk,A_3,success,0.078903, +calculateTotal_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/calculateTotal_test_llzk/calculateTotal_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/calculateTotal_test.llzk,CalculateTotal_0,success,0.054077, +chi_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/chi_test_llzk/chi_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/chi_test.llzk,Chi_6,success,0.946488, +constants_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/constants_test_llzk/constants_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/constants_test.llzk,A_1,success,0.108238, +decryptMultiple_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/decryptMultiple_test_llzk/decryptMultiple_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/decryptMultiple_test.llzk,DecryptBits_1,success,0.119303, +decrypt_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/decrypt_test_llzk/decrypt_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/decrypt_test.llzk,Decrypt_1,success,0.116534, +edwards2montgomery,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/edwards2montgomery_llzk/edwards2montgomery.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/edwards2montgomery.llzk,Edwards2Montgomery_0,success,0.050867, +encryptMultiple_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/encryptMultiple_test_llzk/encryptMultiple_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/encryptMultiple_test.llzk,EncryptBits_2,success,0.127958, +encrypt_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/encrypt_test_llzk/encrypt_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/encrypt_test.llzk,Encrypt_2,success,0.118132, +escalarmulw4table,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_llzk/escalarmulw4table.llzk,,Main_0,error,0.360849,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_llzk/escalarmulw4table.llzk:82:26: error: 'felt.const' op operation destroyed but still has uses + %felt_const_4_24 = felt.const 4 : <""bn128""> + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_llzk/escalarmulw4table.llzk:82:26: note: see current operation: %0 = ""felt.const""() <{value = #felt> : !felt.type<""bn128"">}> : () -> !felt.type<""bn128""> +/Users/r" +escalarmulw4table_test3,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_test3_llzk/escalarmulw4table_test3.llzk,,Main_0,error,0.330900,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_test3_llzk/escalarmulw4table_test3.llzk:82:26: error: 'felt.const' op operation destroyed but still has uses + %felt_const_4_24 = felt.const 4 : <""bn128""> + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_test3_llzk/escalarmulw4table_test3.llzk:82:26: note: see current operation: %0 = ""felt.const""() <{value = #felt> : !felt.type<""bn128"">}> : () -> !fel" +escalarmulw4table_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_test_llzk/escalarmulw4table_test.llzk,,Main_0,error,0.324271,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_test_llzk/escalarmulw4table_test.llzk:82:26: error: 'felt.const' op operation destroyed but still has uses + %felt_const_4_24 = felt.const 4 : <""bn128""> + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/escalarmulw4table_test_llzk/escalarmulw4table_test.llzk:82:26: note: see current operation: %0 = ""felt.const""() <{value = #felt> : !felt.type<""bn128"">}> : () -> !felt.ty" +fp12multiply,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/fp12multiply_llzk/fp12multiply.llzk,,Fp12Multiply_14,error,1.020967,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/fp12multiply_llzk/fp12multiply.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/fp12multiply_llzk/fp12multiply.llzk:2270:14: note: see current operation: +%5" +greatereqthan,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/greatereqthan_llzk/Num2Bits_0_unrolled.llzk,,,error,0.000000,failed to find llzk.main root struct +greatereqthan,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/greatereqthan_llzk/greatereqthan.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/greatereqthan.llzk,GreaterEqThan_2,success,0.062055, +greaterthan,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/greaterthan_llzk/greaterthan.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/greaterthan.llzk,GreaterThan_2,success,0.059652, +inTest,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/inTest_llzk/inTest.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/inTest.llzk,IN_5,success,0.077535, +iota10_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/iota10_test_llzk/iota10_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/iota10_test.llzk,Iota_3,success,0.086787, +iota3_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/iota3_test_llzk/iota3_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/iota3_test.llzk,Iota_3,success,0.087816, +isequal,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/isequal_llzk/isequal.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/isequal.llzk,IsEqual_1,success,0.054302, +iszero,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/iszero_llzk/iszero.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/iszero.llzk,IsZero_0,success,0.049722, +keccakfRound0_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/keccakfRound0_test_llzk/keccakfRound0_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/keccakfRound0_test.llzk,KeccakfRound_88,success,3.889800, +keccakfRound20_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/keccakfRound20_test_llzk/keccakfRound20_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/keccakfRound20_test.llzk,KeccakfRound_88,success,3.971782, +lesseqthan,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/lesseqthan_llzk/lesseqthan.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/lesseqthan.llzk,LessEqThan_2,success,0.063208, +lessthan,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/lessthan_llzk/lessthan.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/lessthan.llzk,LessThan_1,success,0.055721, +linefunctionequal_35_11,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/linefunctionequal_35_11_llzk/linefunctionequal_35_11.llzk,,LineFunctionEqual_15,error,1.087144,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/linefunctionequal_35_11_llzk/linefunctionequal_35_11.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/linefunctionequal_35_11_llzk/linefunctionequal_35_11.ll" +linefunctionequal,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/linefunctionequal_llzk/linefunctionequal.llzk,,LineFunctionEqual_15,error,1.068064,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/linefunctionequal_llzk/linefunctionequal.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/linefunctionequal_llzk/linefunctionequal.llzk:2270:14: note: see cu" +main,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/main_llzk/main.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/main.llzk,fulladder_0,success,0.047750, +matAdd_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matAdd_test_llzk/matAdd_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matAdd_test.llzk,matAdd_0,success,0.053498, +matElemMul_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matElemMul_test_llzk/matElemMul_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matElemMul_test.llzk,matElemMul_0,success,0.051740, +matElemPow_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matElemPow_test_llzk/matElemPow_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matElemPow_test.llzk,matElemPow_1,success,0.063273, +matMul_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matMul_test_llzk/matMul_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matMul_test.llzk,matMul_2,success,0.096011, +matPow_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matPow_test_llzk/matPow_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matPow_test.llzk,matPow_3,success,0.139229, +matScalarAdd_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matScalarAdd_test_llzk/matScalarAdd_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matScalarAdd_test.llzk,matScalarAdd_0,success,0.051679, +matScalarMul_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matScalarMul_test_llzk/matScalarMul_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matScalarMul_test.llzk,matScalarMul_0,success,0.053842, +matScalarSub_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matScalarSub_test_llzk/matScalarSub_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matScalarSub_test.llzk,matScalarSub_0,success,0.051045, +matSub_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/matSub_test_llzk/matSub_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/matSub_test.llzk,matSub_0,success,0.052684, +millerloop_35_11,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/millerloop_35_11_llzk/millerloop_35_11.llzk,,MillerLoop1_55,error,3.440892,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/millerloop_35_11_llzk/millerloop_35_11.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/millerloop_35_11_llzk/millerloop_35_11.llzk:2270:14: note: see curren" +mimc_sponge_hash_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mimc_sponge_hash_test_llzk/mimc_sponge_hash_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mimc_sponge_hash_test.llzk,MiMCSponge_1,success,0.219785, +mimc_sponge_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mimc_sponge_test_llzk/mimc_sponge_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mimc_sponge_test.llzk,MiMCFeistel_0,success,0.255137, +mimc_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mimc_test_llzk/mimc_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mimc_test.llzk,MiMC7_0,success,0.135068, +mnist_convnet_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mnist_convnet_test_llzk/mnist_convnet_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mnist_convnet_test.llzk,mnist_convnet_21,success,0.706058, +mnist_latest_precision_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mnist_latest_precision_test_llzk/mnist_latest_precision_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mnist_latest_precision_test.llzk,mnist_latest_precision_29,success,0.868617, +mnist_latest_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mnist_latest_test_llzk/mnist_latest_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mnist_latest_test.llzk,mnist_latest_25,success,0.828857, +mnist_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mnist_test_llzk/mnist_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mnist_test.llzk,mnist_20,success,0.333557, +model1_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/model1_test_llzk/model1_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/model1_test.llzk,model1_14,success,0.199973, +montgomery2edwards,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/montgomery2edwards_llzk/montgomery2edwards.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/montgomery2edwards.llzk,Montgomery2Edwards_0,success,0.049780, +montgomeryadd,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/montgomeryadd_llzk/montgomeryadd.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/montgomeryadd.llzk,MontgomeryAdd_0,success,0.053118, +montgomerydouble,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/montgomerydouble_llzk/montgomerydouble.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/montgomerydouble.llzk,MontgomeryDouble_0,success,0.053034, +mul_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mul_test_llzk/mul_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mul_test.llzk,Mul_1,success,0.465425, +mux1_1,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mux1_1_llzk/mux1_1.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux1_1.llzk,Main_4,success,0.068116, +mux2_1,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mux2_1_llzk/mux2_1.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux2_1.llzk,Main_4,success,0.078751, +mux3_1,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mux3_1_llzk/mux3_1.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux3_1.llzk,Main_4,success,0.090269, +mux4_1,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mux4_1_llzk/mux4_1.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux4_1.llzk,Main_4,success,0.122975, +mux_decode,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mux_decode_llzk/mux_decode.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux_decode.llzk,Decoder_0,success,0.050447, +mux_ep,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/mux_ep_llzk/mux_ep.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux_ep.llzk,EscalarProduct_0,success,0.050304, +outer_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/outer_test_llzk/outer_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/outer_test.llzk,outer_0,success,0.052229, +pad_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/pad_test_llzk/pad_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/pad_test.llzk,Pad_0,success,0.075207, +pointbits_loopback,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/pointbits_loopback_llzk/pointbits_loopback.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/pointbits_loopback.llzk,Main_9,success,0.149901, +pubkeygen,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/pubkeygen_llzk/pubkeygen.llzk,,ECDSAPrivToPub_30,error,28.303155,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/pubkeygen_llzk/pubkeygen.llzk:2029:16: warning: failed to transform op: could not identify an upper bound + %410:2 = scf.while (%arg5 = %409, %arg6 = %407) : (!felt.type<""bn128"">, !felt.type<""bn128"">) -> (!felt.type<""bn128"">, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/pubkeygen_llzk/pubkeygen.llzk:2029:16: note: see current operation: +%414:2 = scf.while (%arg5 = %413, %arg6 = %411) : (!f" +queryTest,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/queryTest_llzk/queryTest.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/queryTest.llzk,Query_9,success,0.141533, +quinGeneratePathIndices_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/quinGeneratePathIndices_test_llzk/quinGeneratePathIndices_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/quinGeneratePathIndices_test.llzk,QuinGeneratePathIndices_3,success,0.083173, +quinSelector_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/quinSelector_test_llzk/quinSelector_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/quinSelector_test.llzk,QuinSelector_5,success,0.082768, +rhopi_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/rhopi_test_llzk/rhopi_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/rhopi_test.llzk,RhoPi_74,success,1.015659, +sign_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/sign_test_llzk/sign_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/sign_test.llzk,Sign_2,success,0.075081, +splicer_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/splicer_test_llzk/splicer_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/splicer_test.llzk,Splicer_9,success,0.127248, +squeeze_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/squeeze_test_llzk/squeeze_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/squeeze_test.llzk,Squeeze_0,success,0.052897, +subgroupcheckG1,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/subgroupcheckG1_llzk/subgroupcheckG1.llzk,,SubgroupCheckG1_60,error,3.344275,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/subgroupcheckG1_llzk/subgroupcheckG1.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/subgroupcheckG1_llzk/subgroupcheckG1.llzk:2270:14: note: see current op" +sum_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/sum_test_llzk/sum_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/sum_test.llzk,A_3,success,0.079506, +test_bigadd_15,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigadd_15_llzk/test_bigadd_15.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigadd_15.llzk,BigAdd_4,success,0.082526, +test_bigadd_23,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigadd_23_llzk/test_bigadd_23.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigadd_23.llzk,BigAdd_4,success,0.082833, +test_biglessthan_23,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_biglessthan_23_llzk/test_biglessthan_23.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_biglessthan_23.llzk,BigLessThan_6,success,0.150334, +test_bigmod_22,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigmod_22_llzk/test_bigmod_22.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigmod_22.llzk,BigMod_16,success,1.127600, +test_bigmod_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigmod_32_llzk/test_bigmod_32.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigmod_32.llzk,BigMod_16,success,1.162831, +test_bigmult_21,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigmult_21_llzk/test_bigmult_21.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigmult_21.llzk,BigMult_4,success,0.109814, +test_bigmult_22,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigmult_22_llzk/test_bigmult_22.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigmult_22.llzk,BigMult_4,success,0.157409, +test_bigmult_23,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigmult_23_llzk/test_bigmult_23.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigmult_23.llzk,BigMult_4,success,0.169844, +test_bigsub_15,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigsub_15_llzk/test_bigsub_15.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigsub_15.llzk,BigSub_6,success,0.087779, +test_bigsub_23,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigsub_23_llzk/test_bigsub_23.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigsub_23.llzk,BigSub_6,success,0.087350, +test_bigsubmodp_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bigsubmodp_32_llzk/test_bigsubmodp_32.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_bigsubmodp_32.llzk,BigSubModP_10,success,0.108798, +test_bls12-381_add,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bls12-381_add_llzk/test_bls12-381_add.llzk,,EllipticCurveAddUnequal_20,error,1.534037,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bls12-381_add_llzk/test_bls12-381_add.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bls12-381_add_llzk/test_bls12-381_add.llzk:2270:14: note: se" +test_bls12-381_double,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bls12-381_double_llzk/test_bls12-381_double.llzk,,EllipticCurveDouble_29,error,2.079688,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bls12-381_double_llzk/test_bls12-381_double.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_bls12-381_double_llzk/test_bls12-381_double.llzk:2270:" +test_ecdsa,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_ecdsa_llzk/test_ecdsa.llzk,,ECDSAPrivToPub_30,error,28.150417,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_ecdsa_llzk/test_ecdsa.llzk:2029:16: warning: failed to transform op: could not identify an upper bound + %410:2 = scf.while (%arg5 = %407, %arg6 = %409) : (!felt.type<""bn128"">, !felt.type<""bn128"">) -> (!felt.type<""bn128"">, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_ecdsa_llzk/test_ecdsa.llzk:2029:16: note: see current operation: +%414:2 = scf.while (%arg5 = %411, %arg6 = %413) :" +test_ecdsa_verify,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_ecdsa_verify_llzk/test_ecdsa_verify.llzk,,ECDSAVerifyNoPubkeyCheck_57,error,48.482615,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_ecdsa_verify_llzk/test_ecdsa_verify.llzk:2890:17: warning: failed to transform op: could not identify an upper bound + %1024 = scf.while (%arg6 = %1023) : (!felt.type<""bn128"">) -> !felt.type<""bn128""> { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_ecdsa_verify_llzk/test_ecdsa_verify.llzk:2890:17: note: see current operation: +%1027 = scf.while (%arg6 = %1026) : (!felt.type<""bn128"">) -> !felt.type<""bn1" +test_fp12_add_22,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_add_22_llzk/test_fp12_add_22.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_fp12_add_22.llzk,Fp12Add_16,success,0.184616, +test_fp12_compression_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_compression_32_llzk/test_fp12_compression_32.llzk,,test_46,error,2.653165,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_compression_32_llzk/test_fp12_compression_32.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_compression_32_llzk/test_fp12_compression_3" +test_fp12_cyclotomicExp_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_cyclotomicExp_32_llzk/test_fp12_cyclotomicExp_32.llzk,,Fp12CyclotomicExp_66,error,3.513594,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_cyclotomicExp_32_llzk/test_fp12_cyclotomicExp_32.llzk:2768:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_cyclotomicExp_32_llzk/test_fp12_cycloto" +test_fp12_cyclotomicSquare_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_cyclotomicSquare_32_llzk/test_fp12_cyclotomicSquare_32.llzk,,Fp12CyclotomicSquare_17,error,1.109076,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_cyclotomicSquare_32_llzk/test_fp12_cyclotomicSquare_32.llzk:2768:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_cyclotomicSquare_32_llzk/test_fp1" +test_fp12_invert_42,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_invert_42_llzk/test_fp12_invert_42.llzk,,Fp12Invert_15,error,1.929146,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_invert_42_llzk/test_fp12_invert_42.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_invert_42_llzk/test_fp12_invert_42.llzk:2270:14: note" +test_fp12_multiply_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_multiply_32_llzk/test_fp12_multiply_32.llzk,,Fp12Multiply_14,error,1.023798,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_multiply_32_llzk/test_fp12_multiply_32.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp12_multiply_32_llzk/test_fp12_multiply_32.llzk:2270:" +test_fp2_add_22,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_add_22_llzk/test_fp2_add_22.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_fp2_add_22.llzk,Fp2Add_16,success,0.183541, +test_fp2_invert_42,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_invert_42_llzk/test_fp2_invert_42.llzk,,Fp2Invert_15,error,1.411220,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_invert_42_llzk/test_fp2_invert_42.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_invert_42_llzk/test_fp2_invert_42.llzk:2270:14: note: se" +test_fp2_multiply_42,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_multiply_42_llzk/test_fp2_multiply_42.llzk,,Fp2Multiply_14,error,0.995432,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_multiply_42_llzk/test_fp2_multiply_42.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_fp2_multiply_42_llzk/test_fp2_multiply_42.llzk:2270:14: " +test_linefunc_equal_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_linefunc_equal_32_llzk/test_linefunc_equal_32.llzk,,LineFunctionEqual_15,error,1.119471,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_linefunc_equal_32_llzk/test_linefunc_equal_32.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_linefunc_equal_32_llzk/test_linefunc_equal_32.llzk:2" +test_linefunc_unequal_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_linefunc_unequal_32_llzk/test_linefunc_unequal_32.llzk,,LineFunctionUnequal_12,error,0.982520,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_linefunc_unequal_32_llzk/test_linefunc_unequal_32.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %nondet_502, %arg6 = %553) : (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) -> (!array.type<50 x !felt.type<""bn128"">>, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_linefunc_unequal_32_llzk/test_linefunc_unequal_3" +test_multiply_linefunc_unequal_32,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_multiply_linefunc_unequal_32_llzk/test_multiply_linefunc_unequal_32.llzk,,Fp12MultiplyWithLineUnequal_15,error,1.064143,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_multiply_linefunc_unequal_32_llzk/test_multiply_linefunc_unequal_32.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_multiply_linefunc_unequal_32_l" +test_secp256k1_add,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_add_llzk/test_secp256k1_add.llzk,,EllipticCurveAddUnequal_20,error,1.540582,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_add_llzk/test_secp256k1_add.llzk:2270:14: warning: failed to transform op: could not identify an upper bound + %554:2 = scf.while (%arg5 = %553, %arg6 = %nondet_502) : (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) -> (!felt.type<""bn128"">, !array.type<50 x !felt.type<""bn128"">>) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_add_llzk/test_secp256k1_add.llzk:2270:14: note: se" +test_secp256k1_double,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_double_llzk/test_secp256k1_double.llzk,,Secp256k1Double_22,error,2.756534,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_double_llzk/test_secp256k1_double.llzk:2029:16: warning: failed to transform op: could not identify an upper bound + %410:2 = scf.while (%arg5 = %409, %arg6 = %407) : (!felt.type<""bn128"">, !felt.type<""bn128"">) -> (!felt.type<""bn128"">, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_double_llzk/test_secp256k1_double.llzk:2029:16: note: see current operation: +%414:" +test_secp256k1_poc,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_poc_llzk/test_secp256k1_poc.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/test_secp256k1_poc.llzk,Secp256k1PointOnCurve_10,success,1.388702, +test_secp256k1_scalarmult,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_scalarmult_llzk/test_secp256k1_scalarmult.llzk,,Secp256k1ScalarMult_36,error,4.495140,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_scalarmult_llzk/test_secp256k1_scalarmult.llzk:2029:16: warning: failed to transform op: could not identify an upper bound + %410:2 = scf.while (%arg5 = %407, %arg6 = %409) : (!felt.type<""bn128"">, !felt.type<""bn128"">) -> (!felt.type<""bn128"">, !felt.type<""bn128"">) { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_secp256k1_scalarmult_llzk/test_secp256k1_scalarmult.llzk:2029:16: note: see current o" +test_template_assert_valid_signed_header,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_template_assert_valid_signed_header_llzk/test_template_assert_valid_signed_header.llzk,,TemplateAssertValidSignedHeader_0,error,0.045361,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/test_template_assert_valid_signed_header_llzk/test_template_assert_valid_signed_header.llzk:2:48: error: expected '{' to begin a region + struct.def @TemplateAssertValidSignedHeader_0<[]> { + ^" +theta_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/theta_test_llzk/theta_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/theta_test.llzk,Theta_9,success,2.247112, +trace_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/trace_test_llzk/trace_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/trace_test.llzk,trace_1,success,0.059649, +tranpose_test,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/tranpose_test_llzk/tranpose_test.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/tranpose_test.llzk,transpose_0,success,0.052249, +utils_GetValueByIndex,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_GetValueByIndex_llzk/utils_GetValueByIndex.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_GetValueByIndex.llzk,getValueByIndex_3,success,0.088999, +utils_getClaimExpiration,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_getClaimExpiration_llzk/utils_getClaimExpiration.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_getClaimExpiration.llzk,getClaimExpiration_2,success,0.063632, +utils_getClaimSubjectOtherIden,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_getClaimSubjectOtherIden_llzk/utils_getClaimSubjectOtherIden.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_getClaimSubjectOtherIden.llzk,getClaimSubjectOtherIden_8,success,0.108467, +utils_getSubjectLocation,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_getSubjectLocation_llzk/utils_getSubjectLocation.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_getSubjectLocation.llzk,getSubjectLocation_1,success,0.056595, +utils_isExpirable,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_isExpirable_llzk/utils_isExpirable.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_isExpirable.llzk,isExpirable_0,success,0.046854, +utils_isUpdatable,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_isUpdatable_llzk/utils_isUpdatable.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_isUpdatable.llzk,isUpdatable_0,success,0.048857, +utils_verifyCredentialSubject,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_verifyCredentialSubject_llzk/utils_verifyCredentialSubject.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_verifyCredentialSubject.llzk,verifyCredentialSubject_9,success,0.111880, +utils_verifyExpirationTime,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/utils_verifyExpirationTime_llzk/utils_verifyExpirationTime.llzk,/Users/raghav/Veridise/LLEQ/examples/circom-demo/utils_verifyExpirationTime.llzk,verifyExpirationTime_10,success,0.106554, +verify,/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/verify_llzk/verify.llzk,,ECDSAVerifyNoPubkeyCheck_57,error,49.135559,"/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/verify_llzk/verify.llzk:2890:17: warning: failed to transform op: could not identify an upper bound + %1024 = scf.while (%arg6 = %1023) : (!felt.type<""bn128"">) -> !felt.type<""bn128""> { + ^ +/Users/raghav/Veridise/circom-benchmarks/llzk-outputs/verify_llzk/verify.llzk:2890:17: note: see current operation: +%1027 = scf.while (%arg6 = %1026) : (!felt.type<""bn128"">) -> !felt.type<""bn128""> { + %felt_const_0_1820 = felt.const 0 " diff --git a/examples/circom-demo/inTest.llzk b/examples/circom-demo/inTest.llzk new file mode 100644 index 0000000..e6c1ffd --- /dev/null +++ b/examples/circom-demo/inTest.llzk @@ -0,0 +1,819 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@IN_5::@IN_5<[]>>} { + poly.template @IsZero_0 { + struct.def @IsZero_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_0::@IsZero_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsEqual_1 { + struct.def @IsEqual_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_0::@IsZero_0<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @IsZero_0::@IsZero_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> + %20 = function.call @IsZero_0::@IsZero_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@isz] : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@isz$inputs] : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_0::@IsZero_0::@constrain(%10, %17) : (!struct.type<@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @IsZero_0::@IsZero_0::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isz] : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_0::@IsZero_0::@constrain(%1, %8) : (!struct.type<@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_3 { + struct.def @LessThan_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_2::@Num2Bits_2::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %26 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%13, %23) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_3::@LessThan_3<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_3::@LessThan_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_3::@LessThan_3<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%1, %11) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_4 { + struct.def @GreaterThan_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_3::@LessThan_3<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_3::@LessThan_3::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> + %26 = function.call @LessThan_3::@LessThan_3::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_3::@LessThan_3::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_3::@LessThan_3::@constrain(%14, %23) : (!struct.type<@LessThan_3::@LessThan_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_3::@LessThan_3::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_3::@LessThan_3::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_3::@LessThan_3::@constrain(%1, %10) : (!struct.type<@LessThan_3::@LessThan_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IN_5 { + struct.def @IN_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @gt : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + struct.member @gt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + struct.member @eq : !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> + struct.member @eq$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@IN_5::@IN_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@IN_5::@IN_5<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %24 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %24[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %24 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %24 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_1[%25] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %26[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %27[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_1[%28] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %29[@in] = %27 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%30] = %29 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array[%31] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %54 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @IsEqual_1::@IsEqual_1::@product(%54) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %56 = function.call @IsEqual_1::@IsEqual_1::@compute(%54) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %32[@comp] = %55 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %57 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%57] = %32 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg1[%36] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_1[%38] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = pod.read %39[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %40[%c1] = %37 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array_1[%41] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %42[@in] = %40 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%43] = %42 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %44 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %array[%44] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %46 = pod.read %45[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %45[@count] = %47 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %54 = pod.read %42[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @IsEqual_1::@IsEqual_1::@compute(%54) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %45[@comp] = %55 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %56 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%56] = %45 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %49 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array[%49] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %52 = struct.readm %51[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %arg3, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %53 : !felt.type<"babybear"> + } {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @GreaterThan_4::@GreaterThan_4::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + %26 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %5[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@eq$inputs] = %array_1 : <@IN_5::@IN_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %24 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %25 : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eq] = %array_2 : <@IN_5::@IN_5<[]>>, !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> {product_source = "compute"} + struct.writem %self[@gt$inputs] = %pod_0 : <@IN_5::@IN_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + struct.writem %self[@gt] = %11 : <@IN_5::@IN_5<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@gt] : <@IN_5::@IN_5<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@gt$inputs] : <@IN_5::@IN_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %self[@eq] : <@IN_5::@IN_5<[]>>, !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> {product_source = "constrain"} + %16 = struct.readm %self[@eq$inputs] : <@IN_5::@IN_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %17 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %24 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %16[%25] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = pod.read %26[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = array.read %27[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %arg1[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %16[%31] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = array.read %33[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %15[%35] : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg3, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %38 : !felt.type<"babybear"> + } {product_source = "constrain"} + %18 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %13[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %24 = array.read %15[%arg2] : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "constrain"} + %25 = array.read %16[%arg2] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_1::@IsEqual_1::@constrain(%24, %26) : (!struct.type<@IsEqual_1::@IsEqual_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_4::@GreaterThan_4::@constrain(%13, %23) : (!struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IN_5::@IN_5<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@IN_5::@IN_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@IN_5::@IN_5<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %12 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %12 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %0 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_1[%13] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_1[%16] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %17[@in] = %15 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%18] = %17 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%19] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %42 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %43 = function.call @IsEqual_1::@IsEqual_1::@compute(%42) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %20[@comp] = %43 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %44 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%44] = %20 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %arg1[%24] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array_1[%26] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %27[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %28[%c1] = %25 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_1[%29] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %30[@in] = %28 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%31] = %30 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array[%32] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %34 = pod.read %33[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %33[@count] = %35 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %42 = pod.read %30[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %43 = function.call @IsEqual_1::@IsEqual_1::@compute(%42) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %33[@comp] = %43 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %44 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%44] = %33 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %37 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array[%37] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %arg3, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %41 : !felt.type<"babybear"> + } {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %5[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@eq$inputs] = %array_1 : <@IN_5::@IN_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %12 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %13 : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eq] = %array_2 : <@IN_5::@IN_5<[]>>, !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> {product_source = "compute"} + struct.writem %self[@gt$inputs] = %pod_0 : <@IN_5::@IN_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + struct.writem %self[@gt] = %11 : <@IN_5::@IN_5<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IN_5::@IN_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@IN_5::@IN_5<[]>>, %arg1: !felt.type<"babybear">, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@gt] : <@IN_5::@IN_5<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@gt$inputs] : <@IN_5::@IN_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@eq] : <@IN_5::@IN_5<[]>>, !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@eq$inputs] : <@IN_5::@IN_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %felt_const_0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %4[%13] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg2[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %4[%19] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = pod.read %20[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %3[%23] : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "constrain"} + %25 = struct.readm %24[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.add %arg4, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %26 : !felt.type<"babybear"> + } {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = array.read %6[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %1[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %12 = array.read %3[%arg3] : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "constrain"} + %13 = array.read %4[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_1::@IsEqual_1::@constrain(%12, %14) : (!struct.type<@IsEqual_1::@IsEqual_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_4::@GreaterThan_4::@constrain(%1, %11) : (!struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/iota10_test.llzk b/examples/circom-demo/iota10_test.llzk new file mode 100644 index 0000000..40daeb1 --- /dev/null +++ b/examples/circom-demo/iota10_test.llzk @@ -0,0 +1,797 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Iota_3::@Iota_3<[]>>} { + poly.template @RC_0 { + struct.def @RC_0 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@RC_0::@RC_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_0::@RC_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %felt_const_2147516425, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.shr %felt_const_2147516425, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.bit_and %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@RC_0::@RC_0<[]>> + } + function.def @compute() -> !struct.type<@RC_0::@RC_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_0::@RC_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_2147516425, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %2 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@RC_0::@RC_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@RC_0::@RC_0<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "constrain"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "constrain"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "constrain"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "constrain"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "constrain"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.shr %felt_const_2147516425, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @XOR_1 { + struct.def @XOR_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_1::@XOR_1<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_1::@XOR_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_1::@XOR_1<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @XorArray_2 { + struct.def @XorArray_2 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArray_2::@XorArray_2<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArray_2::@XorArray_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArray_2::@XorArray_2<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @Iota_3 { + struct.def @Iota_3 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @iota : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @iota$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @rc : !struct.type<@RC_0::@RC_0<[]>> + struct.member @rc$inputs : !pod.type<[]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_3::@Iota_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_3::@Iota_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_0::@RC_0::@product() : () -> !struct.type<@RC_0::@RC_0<[]>> + %1 = function.call @RC_0::@RC_0::@compute() : () -> !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %14 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %23 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %26 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_3 : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "compute"} + %2 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %2 : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_0 : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %3 : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@iota] : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@iota$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@rc] : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@rc$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %7[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %4[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %4[%14] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.call @RC_0::@RC_0::@constrain(%7) : (!struct.type<@RC_0::@RC_0<[]>>) -> () {product_source = "constrain"} + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%5, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Iota_3::@Iota_3<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_3::@Iota_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_3::@Iota_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_0::@RC_0::@compute() : () -> !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_3 : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "compute"} + %1 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %1 : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_0 : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %2 : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Iota_3::@Iota_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Iota_3::@Iota_3<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1600 = arith.constant 1600 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@iota] : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@iota$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@rc] : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@rc$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %3[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c64 to %c1600 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.call @RC_0::@RC_0::@constrain(%3) : (!struct.type<@RC_0::@RC_0<[]>>) -> () {product_source = "constrain"} + %5 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%1, %5, %6) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/iota3_test.llzk b/examples/circom-demo/iota3_test.llzk new file mode 100644 index 0000000..873b989 --- /dev/null +++ b/examples/circom-demo/iota3_test.llzk @@ -0,0 +1,797 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Iota_3::@Iota_3<[]>>} { + poly.template @RC_0 { + struct.def @RC_0 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@RC_0::@RC_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_0::@RC_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %felt_const_9223372039002292224, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.shr %felt_const_9223372039002292224, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.bit_and %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@RC_0::@RC_0<[]>> + } + function.def @compute() -> !struct.type<@RC_0::@RC_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_0::@RC_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_9223372039002292224, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %2 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@RC_0::@RC_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@RC_0::@RC_0<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "constrain"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "constrain"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "constrain"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "constrain"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "constrain"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.shr %felt_const_9223372039002292224, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @XOR_1 { + struct.def @XOR_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_1::@XOR_1<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_1::@XOR_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_1::@XOR_1<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @XorArray_2 { + struct.def @XorArray_2 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArray_2::@XorArray_2<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArray_2::@XorArray_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArray_2::@XorArray_2<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @Iota_3 { + struct.def @Iota_3 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @rc : !struct.type<@RC_0::@RC_0<[]>> + struct.member @rc$inputs : !pod.type<[]> + struct.member @iota : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @iota$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_3::@Iota_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_3::@Iota_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_0::@RC_0::@product() : () -> !struct.type<@RC_0::@RC_0<[]>> + %1 = function.call @RC_0::@RC_0::@compute() : () -> !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %pod_0 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_3[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %14 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %17 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %28 = pod.read %pod_3[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_3[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_3[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@b] = %23 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %26 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %28 = pod.read %pod_3[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_3[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_1 : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "compute"} + %2 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %2 : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_3 : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %3 : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@rc] : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@rc$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "constrain"} + %7 = struct.readm %self[@iota] : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@iota$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %5[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %7[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %4[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %4[%14] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.call @RC_0::@RC_0::@constrain(%5) : (!struct.type<@RC_0::@RC_0<[]>>) -> () {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%7, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Iota_3::@Iota_3<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_3::@Iota_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_3::@Iota_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_0::@RC_0::@compute() : () -> !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %pod_0 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_3[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %20 = pod.read %pod_3[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_3[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_1 : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "compute"} + %1 = pod.read %pod_0[@comp] : <[@count: index, @comp: !struct.type<@RC_0::@RC_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %1 : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_3 : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %2 : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Iota_3::@Iota_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Iota_3::@Iota_3<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1600 = arith.constant 1600 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Iota_3::@Iota_3<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@rc] : <@Iota_3::@Iota_3<[]>>, !struct.type<@RC_0::@RC_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@rc$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[]> {product_source = "constrain"} + %3 = struct.readm %arg0[@iota] : <@Iota_3::@Iota_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@iota$inputs] : <@Iota_3::@Iota_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %1[@out] : <@RC_0::@RC_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c64 to %c1600 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.call @RC_0::@RC_0::@constrain(%1) : (!struct.type<@RC_0::@RC_0<[]>>) -> () {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%3, %5, %6) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/isequal.llzk b/examples/circom-demo/isequal.llzk new file mode 100644 index 0000000..bce16d9 --- /dev/null +++ b/examples/circom-demo/isequal.llzk @@ -0,0 +1,159 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@IsEqual_1::@IsEqual_1<[]>>} { + poly.template @IsZero_0 { + struct.def @IsZero_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_0::@IsZero_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsEqual_1 { + struct.def @IsEqual_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_0::@IsZero_0<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @IsZero_0::@IsZero_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> + %20 = function.call @IsZero_0::@IsZero_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@isz] : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@isz$inputs] : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_0::@IsZero_0::@constrain(%10, %17) : (!struct.type<@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @IsZero_0::@IsZero_0::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isz] : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_0::@IsZero_0::@constrain(%1, %8) : (!struct.type<@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/iszero.llzk b/examples/circom-demo/iszero.llzk new file mode 100644 index 0000000..c4f9759 --- /dev/null +++ b/examples/circom-demo/iszero.llzk @@ -0,0 +1,68 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@IsZero_0::@IsZero_0<[]>>} { + poly.template @IsZero_0 { + struct.def @IsZero_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_0::@IsZero_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/keccakfRound0_test.llzk b/examples/circom-demo/keccakfRound0_test.llzk new file mode 100644 index 0000000..c3fc7a3 --- /dev/null +++ b/examples/circom-demo/keccakfRound0_test.llzk @@ -0,0 +1,23017 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>>} { + poly.template @Xor3_0 { + struct.def @Xor3_0 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @mid : !array.type<64 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Xor3_0::@Xor3_0<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg1[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %0 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %felt_const_1, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %12, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %nondet[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %18, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.mul %8, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = array.read %arg1[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.add %21, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = array.read %arg2[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %nondet[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.mul %29, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.sub %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%32] = %31 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@mid] = %nondet : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_0 : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Xor3_0::@Xor3_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Xor3_0::@Xor3_0<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@mid] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c64 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %1[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg1[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.mul %13, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.mul %17, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = felt.mul %11, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + %26 = array.read %arg2[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %arg3[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.add %27, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %1[%31] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = felt.mul %32, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = felt.sub %30, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %0[%35] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %36, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @XOR_1 { + struct.def @XOR_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_1::@XOR_1<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_1::@XOR_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_1::@XOR_1<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @XorArray_2 { + struct.def @XorArray_2 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArray_2::@XorArray_2<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArray_2::@XorArray_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArray_2::@XorArray_2<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @Xor5_3 { + struct.def @Xor5_3 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @xor3 : !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.member @xor3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @xor4 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @xor4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @xor5 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @xor5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>, %arg4: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c192 = arith.constant 192 : index + %self = struct.new : <@Xor5_3::@Xor5_3<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %25 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %3 : !felt.type<"babybear"> + array.write %13[%14] = %12 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %13 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %25 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + %18 = cast.toindex %3 : !felt.type<"babybear"> + %19 = array.read %arg2[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = cast.toindex %3 : !felt.type<"babybear"> + array.write %20[%21] = %19 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %20 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %pod[@count] = %23 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %25 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + %5 = struct.readm %4[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg3[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg4[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_3[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@xor5$inputs] = %pod_4 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor5] = %0 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor4$inputs] = %pod_2 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor4] = %1 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor3$inputs] = %pod_0 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.writem %self[@xor3] = %2 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.writem %self[@out] = %nondet : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Xor5_3::@Xor5_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Xor5_3::@Xor5_3<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>, %arg4: !array.type<64 x !felt.type<"babybear">>, %arg5: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@xor3] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@Xor3_0::@Xor3_0<[]>> + %2 = struct.readm %arg0[@xor3$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@xor4] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %4 = struct.readm %arg0[@xor4$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@xor5] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %6 = struct.readm %arg0[@xor5$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg1[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %14 : !felt.type<"babybear"> + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %14 : !felt.type<"babybear"> + %21 = array.read %arg2[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = cast.toindex %14 : !felt.type<"babybear"> + %24 = array.read %22[%23] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %14 : !felt.type<"babybear"> + %26 = array.read %arg3[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %1[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg4[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = array.read %23[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg5[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = array.read %23[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %14 : !felt.type<"babybear"> + %19 = array.read %0[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%5, %7, %8) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%3, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %11 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @Xor3_0::@Xor3_0::@constrain(%1, %11, %12, %13) : (!struct.type<@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_4 { + struct.def @ShR_4 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_4::@ShR_4<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = array.read %arg0[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_4::@ShR_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_4::@ShR_4<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = array.read %arg1[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_5 { + struct.def @ShL_5 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@ShL_5::@ShL_5<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + array.write %nondet[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_5::@ShL_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_5::@ShL_5<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @OR_6 { + struct.def @OR_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_6::@OR_6<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_6::@OR_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_6::@OR_6<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OrArray_7 { + struct.def @OrArray_7 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@OrArray_7::@OrArray_7<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_6::@OR_6::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_6::@OR_6::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %4 = struct.readm %3[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@OR_6::@OR_6<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + } + struct.writem %self[@aux] = %array_1 : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + struct.writem %self[@out] = %nondet : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@OrArray_7::@OrArray_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@OrArray_7::@OrArray_7<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + %6 = struct.readm %5[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_6::@OR_6::@constrain(%3, %5, %6) : (!struct.type<@OR_6::@OR_6<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @D_8 { + struct.def @D_8 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux3 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @aux3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_5::@ShL_5<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_4::@ShR_4<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@D_8::@D_8<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]> + %pod_6 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_6[@in] = %7 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_5[@count] = %10 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = function.call @ShR_4::@ShR_4::@compute(%12) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> + pod.write %pod_5[@comp] = %13 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %7 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_3[@count] = %10 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = function.call @ShL_5::@ShL_5::@compute(%12) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> + pod.write %pod_3[@comp] = %13 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + %6 = struct.readm %5[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = cast.toindex %4 : !felt.type<"babybear"> + array.write %9[%10] = %8 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %9 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %pod_1[@count] = %12 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %23 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = function.call @OrArray_7::@OrArray_7::@compute(%23, %24) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %25 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %14 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + %15 = struct.readm %14[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %4 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %4 : !felt.type<"babybear"> + array.write %18[%19] = %17 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %18 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %pod_1[@count] = %21 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = function.call @OrArray_7::@OrArray_7::@compute(%23, %24) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %25 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %7 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %21 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = function.call @XorArray_2::@XorArray_2::@compute(%21, %22) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %13 = struct.readm %12[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %4 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %4 : !felt.type<"babybear"> + array.write %16[%17] = %15 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %16 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %pod[@count] = %19 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = function.call @XorArray_2::@XorArray_2::@compute(%21, %22) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %6 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %4 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux3$inputs] = %pod_0 : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@aux3] = %0 : <@D_8::@D_8<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@aux0$inputs] = %pod_6 : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux0] = %1 : <@D_8::@D_8<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@D_8::@D_8<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@aux1] = %3 : <@D_8::@D_8<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@out] = %nondet : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@D_8::@D_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@D_8::@D_8<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux3] : <@D_8::@D_8<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %2 = struct.readm %arg0[@aux3$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@D_8::@D_8<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@D_8::@D_8<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %7 = struct.readm %arg0[@aux0] : <@D_8::@D_8<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + %8 = struct.readm %arg0[@aux0$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %8[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = struct.readm %7[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %15 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = struct.readm %5[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %23 = cast.toindex %15 : !felt.type<"babybear"> + %24 = array.read %22[%23] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg2[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = cast.toindex %15 : !felt.type<"babybear"> + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %15 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %0[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%1, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %11 = pod.read %8[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_4::@ShR_4::@constrain(%7, %11) : (!struct.type<@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %12 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %12, %13) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_5::@ShL_5::@constrain(%5, %14) : (!struct.type<@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Theta_9 { + struct.def @Theta_9 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @c2 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d1 : !struct.type<@D_8::@D_8<[]>> + struct.member @d1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r3 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r21 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r22 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r17 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r8 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r14 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c0 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c4 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c1 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r4 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r16 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d4 : !struct.type<@D_8::@D_8<[]>> + struct.member @d4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r2 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r20 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r23 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r9 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r24 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r10 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r19 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d2 : !struct.type<@D_8::@D_8<[]>> + struct.member @d2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r7 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d3 : !struct.type<@D_8::@D_8<[]>> + struct.member @d3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c3 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r12 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r5 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r11 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r13 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r15 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d0 : !struct.type<@D_8::@D_8<[]>> + struct.member @d0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r0 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r6 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r18 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r1 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c128 = arith.constant {product_source = "compute"} 128 : index + %c320 = arith.constant {product_source = "compute"} 320 : index + %self = struct.new : <@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_49 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_50 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_51 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_52 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_53 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_54 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_55 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_56 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_57 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_58 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_59 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_60 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_61 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_62 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_63 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_64 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_65 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_66 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_67 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_68 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %194 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %194[%195] = %193 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %194 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %197 = arith.subi %196, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %197 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.cmpi eq, %197, %c0 {product_source = "compute"} : index + scf.if %198 { + %231 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %199 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %200 = cast.toindex %199 : !felt.type<"babybear"> {product_source = "compute"} + %201 = array.read %arg0[%200] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %202 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %202[%203] = %201 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %202 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %205 = arith.subi %204, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %205 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.cmpi eq, %205, %c0 {product_source = "compute"} : index + scf.if %206 { + %231 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %207 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "compute"} + %209 = array.read %arg0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %210 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %210[%211] = %209 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %210 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %213 = arith.subi %212, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %213 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.cmpi eq, %213, %c0 {product_source = "compute"} : index + scf.if %214 { + %231 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %215 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "compute"} + %217 = array.read %arg0[%216] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %218 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %219 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %218[%219] = %217 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@d] = %218 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %221 = arith.subi %220, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %221 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.cmpi eq, %221, %c0 {product_source = "compute"} : index + scf.if %222 { + %231 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %223 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %224 = cast.toindex %223 : !felt.type<"babybear"> {product_source = "compute"} + %225 = array.read %arg0[%224] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %226 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %227 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %226[%227] = %225 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@e] = %226 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %229 = arith.subi %228, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %229 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.cmpi eq, %229, %c0 {product_source = "compute"} : index + scf.if %230 { + %231 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %194 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %194[%195] = %193 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@a] = %194 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %197 = arith.subi %196, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %197 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.cmpi eq, %197, %c0 {product_source = "compute"} : index + scf.if %198 { + %208 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %209 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = function.call @XorArray_2::@XorArray_2::@compute(%208, %209) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %210 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %199 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %200 = struct.readm %199[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %206 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %208 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %209 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = function.call @XorArray_2::@XorArray_2::@compute(%208, %209) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %210 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%196] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_34 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %0 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_30 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %1 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_54 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %2 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_6 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %3 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_56 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %4 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d3$inputs] = %pod_46 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d3] = %5 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c4$inputs] = %pod_18 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c4] = %6 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2$inputs] = %pod_0 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2] = %7 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_52 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %8 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_62 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %9 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_14 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %10 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_36 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %11 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_32 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %12 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_24 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %13 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d4$inputs] = %pod_26 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d4] = %14 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_8 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %15 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_28 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %16 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_64 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %17 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_68 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %18 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_50 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %19 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c1$inputs] = %pod_20 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c1] = %20 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3$inputs] = %pod_48 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3] = %21 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@d2$inputs] = %pod_42 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d2] = %22 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_58 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %23 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_40 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %24 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d1$inputs] = %pod_2 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d1] = %25 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_4 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %26 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d0$inputs] = %pod_60 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0] = %27 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c0$inputs] = %pod_16 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c0] = %28 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_22 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %29 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_38 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %30 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_10 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %31 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_66 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %32 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_44 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %33 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_12 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %34 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %35 = struct.readm %self[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = struct.readm %self[@c2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@c2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = struct.readm %self[@d1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@d1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@r3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@r3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@r21] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@r21$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %44 = struct.readm %self[@r22] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@r22$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@r17] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@r17$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@r8] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@r8$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@r14] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@r14$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %52 = struct.readm %self[@c0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %53 = struct.readm %self[@c0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = struct.readm %self[@c4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %55 = struct.readm %self[@c4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %56 = struct.readm %self[@c1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %57 = struct.readm %self[@c1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = struct.readm %self[@r4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %59 = struct.readm %self[@r4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %60 = struct.readm %self[@r16] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %61 = struct.readm %self[@r16$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %62 = struct.readm %self[@d4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %63 = struct.readm %self[@d4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %64 = struct.readm %self[@r2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %65 = struct.readm %self[@r2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %66 = struct.readm %self[@r20] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %67 = struct.readm %self[@r20$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %68 = struct.readm %self[@r23] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %69 = struct.readm %self[@r23$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %70 = struct.readm %self[@r9] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %71 = struct.readm %self[@r9$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %72 = struct.readm %self[@r24] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %73 = struct.readm %self[@r24$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %74 = struct.readm %self[@r10] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %75 = struct.readm %self[@r10$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %76 = struct.readm %self[@r19] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %77 = struct.readm %self[@r19$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %78 = struct.readm %self[@d2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %79 = struct.readm %self[@d2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %80 = struct.readm %self[@r7] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %81 = struct.readm %self[@r7$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %82 = struct.readm %self[@d3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %83 = struct.readm %self[@d3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %84 = struct.readm %self[@c3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %85 = struct.readm %self[@c3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %86 = struct.readm %self[@r12] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %87 = struct.readm %self[@r12$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %88 = struct.readm %self[@r5] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %89 = struct.readm %self[@r5$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %90 = struct.readm %self[@r11] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %91 = struct.readm %self[@r11$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %92 = struct.readm %self[@r13] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %93 = struct.readm %self[@r13$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %94 = struct.readm %self[@r15] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %95 = struct.readm %self[@r15$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %96 = struct.readm %self[@d0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %97 = struct.readm %self[@d0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %98 = struct.readm %self[@r0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %99 = struct.readm %self[@r0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %100 = struct.readm %self[@r6] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %101 = struct.readm %self[@r6$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %102 = struct.readm %self[@r18] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %103 = struct.readm %self[@r18$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %104 = struct.readm %self[@r1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %105 = struct.readm %self[@r1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %194 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %193 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = cast.toindex %197 : !felt.type<"babybear"> {product_source = "constrain"} + %199 = array.read %arg0[%198] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %200 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %202, %199 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %203 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = cast.toindex %203 : !felt.type<"babybear"> {product_source = "constrain"} + %205 = array.read %arg0[%204] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %206 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %207 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %208 = array.read %206[%207] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %208, %205 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %209 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = cast.toindex %209 : !felt.type<"babybear"> {product_source = "constrain"} + %211 = array.read %arg0[%210] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %212 = pod.read %53[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %213 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %214 = array.read %212[%213] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %214, %211 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %215 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "constrain"} + %217 = array.read %arg0[%216] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %218 = pod.read %53[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %219 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %220 = array.read %218[%219] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %220, %217 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %57[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %57[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %37[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %37[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %85[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %85[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %85[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %85[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %85[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %55[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %55[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %56[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %97[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %54[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %97[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %194 = pod.read %99[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %193 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %198 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %199 = array.read %197[%198] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %200 = pod.read %99[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %202, %199 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %98[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %35[%195] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %89[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %89[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %88[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %74[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %95[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %95[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %94[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %66[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %52[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %105[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %38[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %105[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %104[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %101[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %38[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %101[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %100[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %91[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %38[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %91[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %90[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %38[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %60[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %38[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %42[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %84[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %79[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %56[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %79[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %78[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %64[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %81[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %78[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %81[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %80[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %87[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %78[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %87[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %86[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %78[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %46[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %78[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %44[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %54[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %83[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %83[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %82[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %40[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %82[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %48[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %93[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %82[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %93[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %92[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %103[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %82[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %103[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %102[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %82[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %68[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %52[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %84[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %58[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %70[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %50[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %77[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %77[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %76[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %72[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %106 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%70, %106, %107) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %108 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%66, %108, %109) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %110 = pod.read %91[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %91[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%90, %110, %111) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%42, %112, %113) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %114 = pod.read %93[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %93[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%92, %114, %115) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %116 = pod.read %83[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %117 = pod.read %83[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%82, %116, %117) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %118 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %55[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %55[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%54, %118, %119, %120, %121, %122) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %123 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %126 = pod.read %37[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = pod.read %37[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%36, %123, %124, %125, %126, %127) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %128 = pod.read %89[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %89[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%88, %128, %129) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %130 = pod.read %99[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %99[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%98, %130, %131) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %132 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%50, %132, %133) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %134 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%72, %134, %135) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%68, %136, %137) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %138 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%60, %138, %139) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %140 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%62, %140, %141) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %142 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%44, %142, %143) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %144 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%64, %144, %145) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %146 = pod.read %101[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %147 = pod.read %101[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%100, %146, %147) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %148 = pod.read %105[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %105[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%104, %148, %149) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %150 = pod.read %87[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = pod.read %87[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%86, %150, %151) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %152 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %154 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = pod.read %57[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = pod.read %57[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%56, %152, %153, %154, %155, %156) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %157 = pod.read %85[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = pod.read %85[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %159 = pod.read %85[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = pod.read %85[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = pod.read %85[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%84, %157, %158, %159, %160, %161) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %162 = pod.read %79[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = pod.read %79[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%78, %162, %163) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %164 = pod.read %95[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %165 = pod.read %95[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%94, %164, %165) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %166 = pod.read %77[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = pod.read %77[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%76, %166, %167) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %168 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%38, %168, %169) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %170 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %171 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%40, %170, %171) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %172 = pod.read %97[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = pod.read %97[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%96, %172, %173) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %174 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %176 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %177 = pod.read %53[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %178 = pod.read %53[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%52, %174, %175, %176, %177, %178) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %179 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %180 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%58, %179, %180) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %181 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %182 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%74, %181, %182) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %183 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %184 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%46, %183, %184) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %185 = pod.read %103[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %186 = pod.read %103[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%102, %185, %186) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %187 = pod.read %81[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %188 = pod.read %81[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%80, %187, %188) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %189 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %190 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%48, %189, %190) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Theta_9::@Theta_9<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c128 = arith.constant {product_source = "compute"} 128 : index + %c320 = arith.constant {product_source = "compute"} 320 : index + %self = struct.new : <@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_49 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_50 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_51 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_52 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_53 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_54 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_55 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_56 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_57 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_58 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_59 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_60 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_61 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_62 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_63 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_64 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_65 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_66 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_67 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_68 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg0[%36] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %38 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %41 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %75 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %43 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %46 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %49 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %75 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %51 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %arg0[%52] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %54 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %54[%55] = %53 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %54 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %57 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %75 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %59 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %arg0[%60] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %62[%63] = %61 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@d] = %62 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %65 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %75 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %67 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %arg0[%68] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %70 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %71 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %70[%71] = %69 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@e] = %70 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %73 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %75 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_16[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_16[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_0[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_0[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg0[%36] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@a] = %38 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %41 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %52 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @XorArray_2::@XorArray_2::@compute(%52, %53) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %54 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %43 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %44[%45] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %50 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @XorArray_2::@XorArray_2::@compute(%52, %53) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %54 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%40] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_34 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %0 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_30 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %1 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_54 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %2 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_6 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %3 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_56 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %4 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d3$inputs] = %pod_46 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d3] = %5 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c4$inputs] = %pod_18 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c4] = %6 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2$inputs] = %pod_0 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2] = %7 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_52 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %8 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_62 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %9 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_14 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %10 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_36 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %11 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_32 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %12 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_24 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %13 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d4$inputs] = %pod_26 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d4] = %14 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_8 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %15 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_28 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %16 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_64 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %17 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_68 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %18 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_50 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %19 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c1$inputs] = %pod_20 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c1] = %20 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3$inputs] = %pod_48 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3] = %21 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@d2$inputs] = %pod_42 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d2] = %22 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_58 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %23 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_40 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %24 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d1$inputs] = %pod_2 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d1] = %25 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_4 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %26 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d0$inputs] = %pod_60 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0] = %27 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c0$inputs] = %pod_16 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c0] = %28 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_22 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %29 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_38 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %30 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_10 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %31 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_66 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %32 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_44 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %33 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_12 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %34 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Theta_9::@Theta_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Theta_9::@Theta_9<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@c2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@c2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@d1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@d1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@r3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@r3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@r21] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@r21$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@r22] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@r22$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@r17] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@r17$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@r8] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@r8$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@r14] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@r14$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@c0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@c0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@c4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@c4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@c1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@c1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@r4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@r4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@r16] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@r16$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@d4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@d4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@r2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@r2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@r20] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@r20$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@r23] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@r23$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@r9] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@r9$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@r24] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@r24$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@r10] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@r10$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@r19] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@r19$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@d2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@d2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@r7] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@r7$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@d3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@d3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %arg0[@c3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %50 = struct.readm %arg0[@c3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = struct.readm %arg0[@r12] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %52 = struct.readm %arg0[@r12$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %53 = struct.readm %arg0[@r5] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %54 = struct.readm %arg0[@r5$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = struct.readm %arg0[@r11] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %56 = struct.readm %arg0[@r11$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %57 = struct.readm %arg0[@r13] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %58 = struct.readm %arg0[@r13$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %59 = struct.readm %arg0[@r15] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %60 = struct.readm %arg0[@r15$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %61 = struct.readm %arg0[@d0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %62 = struct.readm %arg0[@d0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %63 = struct.readm %arg0[@r0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %64 = struct.readm %arg0[@r0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %65 = struct.readm %arg0[@r6] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %66 = struct.readm %arg0[@r6$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %67 = struct.readm %arg0[@r18] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %68 = struct.readm %arg0[@r18$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %69 = struct.readm %arg0[@r1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %70 = struct.readm %arg0[@r1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %arg1[%157] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %159[%160] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = cast.toindex %162 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %arg1[%163] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %165[%166] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %arg1[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %172 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %171[%172] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = cast.toindex %174 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %arg1[%175] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = pod.read %18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %178 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %177[%178] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = cast.toindex %180 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %arg1[%181] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = pod.read %18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %184 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %183[%184] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %50[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %50[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %21[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %19[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %arg1[%157] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %159[%160] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %165[%166] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %63[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %53[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %39[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %59[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %31[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %1[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %17[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %3[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %70[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %69[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %3[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %65[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %3[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %55[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %3[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %25[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %3[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %7[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %49[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %21[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %29[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %45[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %51[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %11[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %9[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %19[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %1[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %47[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %47[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %13[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %47[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %57[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %47[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %67[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %47[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %33[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %17[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %49[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %23[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %35[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %15[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %41[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %37[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %71 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %72 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%35, %71, %72) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %73 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%31, %73, %74) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%55, %75, %76) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %77 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%7, %77, %78) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %79 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%57, %79, %80) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %81 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%47, %81, %82) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %83 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %85 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %20[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %87 = pod.read %20[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%19, %83, %84, %85, %86, %87) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %88 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %91 = pod.read %2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%1, %88, %89, %90, %91, %92) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %94 = pod.read %54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%53, %93, %94) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %95 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %96 = pod.read %64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%63, %95, %96) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %97 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%15, %97, %98) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %99 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %100 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%37, %99, %100) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %101 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%33, %101, %102) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %103 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%25, %103, %104) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %105 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %106 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%27, %105, %106) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %107 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %108 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%9, %107, %108) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %109 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%29, %109, %110) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %111 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %112 = pod.read %66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%65, %111, %112) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %113 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %114 = pod.read %70[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%69, %113, %114) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %115 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%51, %115, %116) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %117 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %118 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%21, %117, %118, %119, %120, %121) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %122 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %50[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %126 = pod.read %50[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%49, %122, %123, %124, %125, %126) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %127 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%43, %127, %128) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %129 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %130 = pod.read %60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%59, %129, %130) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %131 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%41, %131, %132) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %133 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %134 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%3, %133, %134) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %135 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%5, %135, %136) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %137 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = pod.read %62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%61, %137, %138) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %139 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = pod.read %18[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %18[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%17, %139, %140, %141, %142, %143) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %144 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%23, %144, %145) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %146 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %147 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%39, %146, %147) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %148 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%11, %148, %149) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %150 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = pod.read %68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%67, %150, %151) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %152 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%45, %152, %153) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %154 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%13, %154, %155) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @stepRhoPi_10 { + struct.def @stepRhoPi_10 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_4::@ShR_4<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_5::@ShL_5<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_10::@stepRhoPi_10<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_4::@ShR_4::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_5::@ShL_5::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + %5 = struct.readm %4[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + %14 = struct.readm %13[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_4::@ShR_4::@constrain(%1, %9) : (!struct.type<@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_5::@ShL_5::@constrain(%3, %10) : (!struct.type<@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_11 { + struct.def @ShR_11 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_11::@ShR_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_11::@ShR_11<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_11::@ShR_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_11::@ShR_11<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_12 { + struct.def @ShL_12 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_12::@ShL_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %self = struct.new : <@ShL_12::@ShL_12<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_12::@ShL_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_12::@ShL_12<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_13 { + struct.def @stepRhoPi_13 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_11::@ShR_11<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_12::@ShL_12<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_13::@stepRhoPi_13<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_11::@ShR_11::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_11::@ShR_11<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_12::@ShL_12::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_12::@ShL_12<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + %5 = struct.readm %4[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + %14 = struct.readm %13[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShR_11::@ShR_11<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShL_12::@ShL_12<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShR_11::@ShR_11<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShL_12::@ShL_12<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_11::@ShR_11::@constrain(%1, %7) : (!struct.type<@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_12::@ShL_12::@constrain(%3, %8) : (!struct.type<@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_14 { + struct.def @ShR_14 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_14::@ShR_14<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_14::@ShR_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_14::@ShR_14<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_15 { + struct.def @ShL_15 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %self = struct.new : <@ShL_15::@ShL_15<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_6 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_15::@ShL_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_15::@ShL_15<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_6 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_16 { + struct.def @stepRhoPi_16 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_15::@ShL_15<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_14::@ShR_14<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_16::@stepRhoPi_16<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_14::@ShR_14::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_15::@ShL_15::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> + %5 = struct.readm %4[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> + %14 = struct.readm %13[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_14::@ShR_14::@constrain(%3, %7) : (!struct.type<@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_15::@ShL_15::@constrain(%1, %8) : (!struct.type<@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_17 { + struct.def @ShR_17 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_17::@ShR_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_17::@ShR_17<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_17::@ShR_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_17::@ShR_17<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_18 { + struct.def @ShL_18 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_18::@ShL_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %self = struct.new : <@ShL_18::@ShL_18<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_10 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_18::@ShL_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_18::@ShL_18<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_10 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_19 { + struct.def @stepRhoPi_19 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_17::@ShR_17<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_18::@ShL_18<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_19::@stepRhoPi_19<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_17::@ShR_17::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_17::@ShR_17<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_18::@ShL_18::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_18::@ShL_18<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + %5 = struct.readm %4[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + %14 = struct.readm %13[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShR_17::@ShR_17<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShL_18::@ShL_18<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShR_17::@ShR_17<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShL_18::@ShL_18<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_17::@ShR_17::@constrain(%1, %7) : (!struct.type<@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_18::@ShL_18::@constrain(%5, %10) : (!struct.type<@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_20 { + struct.def @ShR_20 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_20::@ShR_20<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_20::@ShR_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_20::@ShR_20<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_21 { + struct.def @ShL_21 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %self = struct.new : <@ShL_21::@ShL_21<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_15) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_15 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_21::@ShL_21<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_21::@ShL_21<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_15) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_15 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_22 { + struct.def @stepRhoPi_22 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_20::@ShR_20<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_21::@ShL_21<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_22::@stepRhoPi_22<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_20::@ShR_20::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_21::@ShL_21::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> + %5 = struct.readm %4[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> + %14 = struct.readm %13[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_20::@ShR_20::@constrain(%3, %9) : (!struct.type<@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_21::@ShL_21::@constrain(%5, %10) : (!struct.type<@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_23 { + struct.def @ShR_23 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_23::@ShR_23<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_23::@ShR_23<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_23::@ShR_23<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_23::@ShR_23<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_24 { + struct.def @ShL_24 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_24::@ShL_24<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %self = struct.new : <@ShL_24::@ShL_24<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_21) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_24::@ShL_24<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_24::@ShL_24<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_21) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_25 { + struct.def @stepRhoPi_25 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_23::@ShR_23<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_24::@ShL_24<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_25::@stepRhoPi_25<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_23::@ShR_23::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_23::@ShR_23<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_24::@ShL_24::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_24::@ShL_24<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + %5 = struct.readm %4[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + %14 = struct.readm %13[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShR_23::@ShR_23<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShL_24::@ShL_24<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShR_23::@ShR_23<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShL_24::@ShL_24<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_23::@ShR_23::@constrain(%3, %9) : (!struct.type<@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_24::@ShL_24::@constrain(%5, %10) : (!struct.type<@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_26 { + struct.def @ShR_26 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_26::@ShR_26<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_26::@ShR_26<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_26::@ShR_26<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_27 { + struct.def @ShL_27 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %self = struct.new : <@ShL_27::@ShL_27<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_28) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_27::@ShL_27<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_27::@ShL_27<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_28) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_28 { + struct.def @stepRhoPi_28 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_26::@ShR_26<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_27::@ShL_27<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_28::@stepRhoPi_28<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_26::@ShR_26::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_27::@ShL_27::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> + %5 = struct.readm %4[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> + %14 = struct.readm %13[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_26::@ShR_26::@constrain(%1, %7) : (!struct.type<@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_27::@ShL_27::@constrain(%5, %10) : (!struct.type<@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_29 { + struct.def @ShR_29 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_29::@ShR_29<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_29::@ShR_29<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_29::@ShR_29<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_29::@ShR_29<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_30 { + struct.def @ShL_30 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_30::@ShL_30<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %self = struct.new : <@ShL_30::@ShL_30<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_36) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_30::@ShL_30<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_30::@ShL_30<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_36) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_31 { + struct.def @stepRhoPi_31 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_29::@ShR_29<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_30::@ShL_30<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_31::@stepRhoPi_31<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_29::@ShR_29::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_29::@ShR_29<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_30::@ShL_30::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_30::@ShL_30<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + %5 = struct.readm %4[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + %14 = struct.readm %13[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShL_30::@ShL_30<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShR_29::@ShR_29<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShR_29::@ShR_29<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShL_30::@ShL_30<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_30::@ShL_30::@constrain(%3, %7) : (!struct.type<@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_29::@ShR_29::@constrain(%1, %8) : (!struct.type<@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_32 { + struct.def @ShR_32 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_32::@ShR_32<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_32::@ShR_32<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_32::@ShR_32<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_33 { + struct.def @ShL_33 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %self = struct.new : <@ShL_33::@ShL_33<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_45) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_45 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_33::@ShL_33<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_33::@ShL_33<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_45) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_45 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_34 { + struct.def @stepRhoPi_34 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_32::@ShR_32<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_33::@ShL_33<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_34::@stepRhoPi_34<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_32::@ShR_32::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_33::@ShL_33::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> + %5 = struct.readm %4[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> + %14 = struct.readm %13[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_32::@ShR_32::@constrain(%1, %9) : (!struct.type<@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_33::@ShL_33::@constrain(%5, %10) : (!struct.type<@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_35 { + struct.def @ShR_35 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_35::@ShR_35<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_35::@ShR_35<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_35::@ShR_35<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_35::@ShR_35<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_36 { + struct.def @ShL_36 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_36::@ShL_36<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %self = struct.new : <@ShL_36::@ShL_36<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_55) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_55 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_36::@ShL_36<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_36::@ShL_36<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_55) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_55 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_37 { + struct.def @stepRhoPi_37 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_35::@ShR_35<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_36::@ShL_36<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_37::@stepRhoPi_37<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_35::@ShR_35::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_35::@ShR_35<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_36::@ShL_36::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_36::@ShL_36<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + %5 = struct.readm %4[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + %14 = struct.readm %13[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShR_35::@ShR_35<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShL_36::@ShL_36<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShR_35::@ShR_35<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShL_36::@ShL_36<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_35::@ShR_35::@constrain(%1, %7) : (!struct.type<@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_36::@ShL_36::@constrain(%5, %8) : (!struct.type<@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_38 { + struct.def @ShR_38 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_38::@ShR_38<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_38::@ShR_38<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_38::@ShR_38<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_39 { + struct.def @ShL_39 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@ShL_39::@ShL_39<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_39::@ShL_39<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_39::@ShL_39<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_40 { + struct.def @stepRhoPi_40 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_39::@ShL_39<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_38::@ShR_38<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_40::@stepRhoPi_40<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_38::@ShR_38::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_39::@ShL_39::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> + %5 = struct.readm %4[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> + %14 = struct.readm %13[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_39::@ShL_39::@constrain(%1, %7) : (!struct.type<@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_38::@ShR_38::@constrain(%5, %10) : (!struct.type<@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_41 { + struct.def @ShR_41 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_41::@ShR_41<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_41::@ShR_41<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_41::@ShR_41<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_41::@ShR_41<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_42 { + struct.def @ShL_42 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_42::@ShL_42<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %self = struct.new : <@ShL_42::@ShL_42<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_14) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_14 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_42::@ShL_42<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_42::@ShL_42<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_14) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_14 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_43 { + struct.def @stepRhoPi_43 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_42::@ShL_42<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_41::@ShR_41<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_43::@stepRhoPi_43<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_41::@ShR_41::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_41::@ShR_41<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_42::@ShL_42::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_42::@ShL_42<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + %5 = struct.readm %4[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + %14 = struct.readm %13[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShR_41::@ShR_41<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShL_42::@ShL_42<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShL_42::@ShL_42<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShR_41::@ShR_41<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_41::@ShR_41::@constrain(%5, %7) : (!struct.type<@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_42::@ShL_42::@constrain(%1, %8) : (!struct.type<@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_44 { + struct.def @ShR_44 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_44::@ShR_44<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_44::@ShR_44<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_44::@ShR_44<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_45 { + struct.def @ShL_45 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %self = struct.new : <@ShL_45::@ShL_45<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_27) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_27 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_45::@ShL_45<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_45::@ShL_45<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_27) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_27 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_46 { + struct.def @stepRhoPi_46 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_45::@ShL_45<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_44::@ShR_44<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_46::@stepRhoPi_46<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_44::@ShR_44::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_45::@ShL_45::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> + %5 = struct.readm %4[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> + %14 = struct.readm %13[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_44::@ShR_44::@constrain(%3, %7) : (!struct.type<@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_45::@ShL_45::@constrain(%1, %8) : (!struct.type<@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_47 { + struct.def @ShR_47 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_47::@ShR_47<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_47::@ShR_47<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_47::@ShR_47<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_47::@ShR_47<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_48 { + struct.def @ShL_48 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_48::@ShL_48<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %self = struct.new : <@ShL_48::@ShL_48<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_41) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_41 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_48::@ShL_48<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_48::@ShL_48<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_41) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_41 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_49 { + struct.def @stepRhoPi_49 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_47::@ShR_47<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_48::@ShL_48<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_49::@stepRhoPi_49<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_47::@ShR_47::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_47::@ShR_47<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_48::@ShL_48::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_48::@ShL_48<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + %5 = struct.readm %4[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + %14 = struct.readm %13[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShR_47::@ShR_47<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShL_48::@ShL_48<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShR_47::@ShR_47<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShL_48::@ShL_48<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_47::@ShR_47::@constrain(%3, %9) : (!struct.type<@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_48::@ShL_48::@constrain(%5, %10) : (!struct.type<@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_50 { + struct.def @ShR_50 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_50::@ShR_50<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_50::@ShR_50<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_50::@ShR_50<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_51 { + struct.def @ShL_51 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %self = struct.new : <@ShL_51::@ShL_51<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_56) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_51::@ShL_51<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_51::@ShL_51<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_56) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_52 { + struct.def @stepRhoPi_52 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_50::@ShR_50<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_51::@ShL_51<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_52::@stepRhoPi_52<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_50::@ShR_50::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_51::@ShL_51::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> + %5 = struct.readm %4[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> + %14 = struct.readm %13[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_51::@ShL_51::@constrain(%5, %7) : (!struct.type<@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_50::@ShR_50::@constrain(%3, %10) : (!struct.type<@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_53 { + struct.def @ShR_53 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_53::@ShR_53<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_53::@ShR_53<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_53::@ShR_53<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_53::@ShR_53<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_54 { + struct.def @ShL_54 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_54::@ShL_54<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %self = struct.new : <@ShL_54::@ShL_54<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_54::@ShL_54<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_54::@ShL_54<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_55 { + struct.def @stepRhoPi_55 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_54::@ShL_54<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_53::@ShR_53<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_55::@stepRhoPi_55<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_53::@ShR_53::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_53::@ShR_53<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_54::@ShL_54::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_54::@ShL_54<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + %5 = struct.readm %4[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + %14 = struct.readm %13[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShL_54::@ShL_54<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShR_53::@ShR_53<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShL_54::@ShL_54<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShR_53::@ShR_53<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_54::@ShL_54::@constrain(%3, %7) : (!struct.type<@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_53::@ShR_53::@constrain(%5, %10) : (!struct.type<@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_56 { + struct.def @ShR_56 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_56::@ShR_56<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_56::@ShR_56<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_56::@ShR_56<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_57 { + struct.def @ShL_57 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %self = struct.new : <@ShL_57::@ShL_57<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_25) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_57::@ShL_57<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_57::@ShL_57<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_25) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_58 { + struct.def @stepRhoPi_58 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_56::@ShR_56<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_57::@ShL_57<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_58::@stepRhoPi_58<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_56::@ShR_56::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_57::@ShL_57::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> + %5 = struct.readm %4[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> + %14 = struct.readm %13[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_56::@ShR_56::@constrain(%3, %9) : (!struct.type<@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_57::@ShL_57::@constrain(%5, %10) : (!struct.type<@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_59 { + struct.def @ShR_59 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_59::@ShR_59<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_59::@ShR_59<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_59::@ShR_59<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_59::@ShR_59<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_60 { + struct.def @ShL_60 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_60::@ShL_60<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %self = struct.new : <@ShL_60::@ShL_60<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_43) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_60::@ShL_60<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_60::@ShL_60<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_43) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_61 { + struct.def @stepRhoPi_61 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_60::@ShL_60<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_59::@ShR_59<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_61::@stepRhoPi_61<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_59::@ShR_59::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_59::@ShR_59<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_60::@ShL_60::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_60::@ShL_60<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + %5 = struct.readm %4[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + %14 = struct.readm %13[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShR_59::@ShR_59<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShL_60::@ShL_60<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShL_60::@ShL_60<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShR_59::@ShR_59<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_59::@ShR_59::@constrain(%5, %7) : (!struct.type<@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_60::@ShL_60::@constrain(%1, %8) : (!struct.type<@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_62 { + struct.def @ShR_62 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_62::@ShR_62<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_62::@ShR_62<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_62::@ShR_62<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_63 { + struct.def @ShL_63 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %self = struct.new : <@ShL_63::@ShL_63<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_62) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_63::@ShL_63<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_63::@ShL_63<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_62) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_64 { + struct.def @stepRhoPi_64 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_63::@ShL_63<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_62::@ShR_62<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_64::@stepRhoPi_64<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_62::@ShR_62::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_63::@ShL_63::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> + %5 = struct.readm %4[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> + %14 = struct.readm %13[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_63::@ShL_63::@constrain(%3, %7) : (!struct.type<@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_62::@ShR_62::@constrain(%5, %8) : (!struct.type<@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_65 { + struct.def @ShR_65 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_65::@ShR_65<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_65::@ShR_65<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_65::@ShR_65<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_65::@ShR_65<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_66 { + struct.def @ShL_66 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_66::@ShL_66<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %self = struct.new : <@ShL_66::@ShL_66<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_18 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_66::@ShL_66<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_66::@ShL_66<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_18 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_67 { + struct.def @stepRhoPi_67 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_66::@ShL_66<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_65::@ShR_65<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_67::@stepRhoPi_67<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_65::@ShR_65::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_65::@ShR_65<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_66::@ShL_66::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_66::@ShL_66<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + %5 = struct.readm %4[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + %14 = struct.readm %13[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShL_66::@ShL_66<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShR_65::@ShR_65<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShL_66::@ShL_66<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShR_65::@ShR_65<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_66::@ShL_66::@constrain(%1, %7) : (!struct.type<@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_65::@ShR_65::@constrain(%5, %10) : (!struct.type<@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_68 { + struct.def @ShR_68 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_68::@ShR_68<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_68::@ShR_68<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_68::@ShR_68<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_69 { + struct.def @ShL_69 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %self = struct.new : <@ShL_69::@ShL_69<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_39) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_69::@ShL_69<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_69::@ShL_69<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_39) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_70 { + struct.def @stepRhoPi_70 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_69::@ShL_69<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_68::@ShR_68<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_70::@stepRhoPi_70<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_68::@ShR_68::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_69::@ShL_69::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> + %5 = struct.readm %4[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> + %14 = struct.readm %13[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_69::@ShL_69::@constrain(%1, %9) : (!struct.type<@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_68::@ShR_68::@constrain(%5, %10) : (!struct.type<@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_71 { + struct.def @ShR_71 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_71::@ShR_71<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_71::@ShR_71<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_71::@ShR_71<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_72 { + struct.def @ShL_72 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %self = struct.new : <@ShL_72::@ShL_72<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_61) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_72::@ShL_72<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_72::@ShL_72<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_61) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_73 { + struct.def @stepRhoPi_73 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_72::@ShL_72<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_71::@ShR_71<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_73::@stepRhoPi_73<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_71::@ShR_71::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_72::@ShL_72::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> + %5 = struct.readm %4[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> + %14 = struct.readm %13[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_71::@ShR_71::@constrain(%5, %7) : (!struct.type<@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_72::@ShL_72::@constrain(%1, %8) : (!struct.type<@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_74 { + struct.def @ShR_74 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_74::@ShR_74<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_74::@ShR_74<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_74::@ShR_74<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_74::@ShR_74<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_75 { + struct.def @ShL_75 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_75::@ShL_75<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %self = struct.new : <@ShL_75::@ShL_75<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_20) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_75::@ShL_75<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_75::@ShL_75<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_20) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_76 { + struct.def @stepRhoPi_76 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_74::@ShR_74<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_75::@ShL_75<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_76::@stepRhoPi_76<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_74::@ShR_74::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_74::@ShR_74<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_74::@ShR_74<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_75::@ShL_75::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_75::@ShL_75<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_75::@ShL_75<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_74::@ShR_74<[]>> + %5 = struct.readm %4[@out] : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_75::@ShL_75<[]>> + %14 = struct.readm %13[@out] : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_74::@ShR_74<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShR_74::@ShR_74<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_75::@ShL_75<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShL_75::@ShL_75<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShR_74::@ShR_74<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShL_75::@ShL_75<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_74::@ShR_74::@constrain(%3, %9) : (!struct.type<@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_75::@ShL_75::@constrain(%5, %10) : (!struct.type<@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_77 { + struct.def @ShR_77 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_77::@ShR_77<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_77::@ShR_77<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_77::@ShR_77<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_77::@ShR_77<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_78 { + struct.def @ShL_78 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_78::@ShL_78<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %self = struct.new : <@ShL_78::@ShL_78<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_44) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_78::@ShL_78<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_78::@ShL_78<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_44) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_79 { + struct.def @stepRhoPi_79 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_77::@ShR_77<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_78::@ShL_78<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_79::@stepRhoPi_79<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_77::@ShR_77::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_77::@ShR_77<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_77::@ShR_77<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_78::@ShL_78::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_78::@ShL_78<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_78::@ShL_78<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_77::@ShR_77<[]>> + %5 = struct.readm %4[@out] : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_78::@ShL_78<[]>> + %14 = struct.readm %13[@out] : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_77::@ShR_77<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShR_77::@ShR_77<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_78::@ShL_78<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShL_78::@ShL_78<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShR_77::@ShR_77<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShL_78::@ShL_78<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_77::@ShR_77::@constrain(%1, %7) : (!struct.type<@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_78::@ShL_78::@constrain(%3, %8) : (!struct.type<@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @RhoPi_80 { + struct.def @RhoPi_80 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @s17 : !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.member @s17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s23 : !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.member @s23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s22 : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.member @s22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s1 : !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + struct.member @s1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s15 : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.member @s15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s7 : !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.member @s7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s3 : !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.member @s3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s19 : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.member @s19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s24 : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.member @s24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s9 : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.member @s9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s13 : !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.member @s13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s20 : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.member @s20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s10 : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.member @s10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s14 : !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.member @s14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s6 : !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + struct.member @s6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s18 : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.member @s18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s5 : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.member @s5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s21 : !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.member @s21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s4 : !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.member @s4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s2 : !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.member @s2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s16 : !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.member @s16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s8 : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.member @s8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s11 : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.member @s11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s12 : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.member @s12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_80::@RhoPi_80<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_384 = felt.const 384 : <"babybear"> + %felt_const_576 = felt.const 576 : <"babybear"> + %felt_const_1408 = felt.const 1408 : <"babybear"> + %felt_const_896 = felt.const 896 : <"babybear"> + %felt_const_1280 = felt.const 1280 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_768 = felt.const 768 : <"babybear"> + %felt_const_832 = felt.const 832 : <"babybear"> + %felt_const_1216 = felt.const 1216 : <"babybear"> + %felt_const_1472 = felt.const 1472 : <"babybear"> + %felt_const_960 = felt.const 960 : <"babybear"> + %felt_const_256 = felt.const 256 : <"babybear"> + %felt_const_1536 = felt.const 1536 : <"babybear"> + %felt_const_1344 = felt.const 1344 : <"babybear"> + %felt_const_512 = felt.const 512 : <"babybear"> + %felt_const_1024 = felt.const 1024 : <"babybear"> + %felt_const_320 = felt.const 320 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_1152 = felt.const 1152 : <"babybear"> + %felt_const_1088 = felt.const 1088 : <"babybear"> + %felt_const_704 = felt.const 704 : <"babybear"> + %felt_const_448 = felt.const 448 : <"babybear"> + %felt_const_640 = felt.const 640 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> + %c64 = arith.constant 64 : index + %self = struct.new : <@RhoPi_80::@RhoPi_80<[]>> + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]> + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_7 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]> + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_9 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]> + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_11 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]> + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_13 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]> + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_15 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]> + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_17 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]> + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_19 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]> + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_21 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]> + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_23 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]> + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_25 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]> + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_27 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]> + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_29 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]> + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_31 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]> + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_33 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]> + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_35 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]> + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_37 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]> + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_39 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]> + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_41 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]> + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_43 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]> + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_45 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]> + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_24[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_23[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_10::@stepRhoPi_10::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + pod.write %pod_23[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_10[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_9[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_13::@stepRhoPi_13::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + pod.write %pod_9[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_44[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_43[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_16::@stepRhoPi_16::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + pod.write %pod_43[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_19::@stepRhoPi_19::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_30[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_29[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_22::@stepRhoPi_22::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + pod.write %pod_29[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_12[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_11[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_25::@stepRhoPi_25::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + pod.write %pod_11[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_32[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_31[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_28::@stepRhoPi_28::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + pod.write %pod_31[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_40[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_39[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_31::@stepRhoPi_31::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + pod.write %pod_39[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_42[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_41[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_34::@stepRhoPi_34::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + pod.write %pod_41[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_34[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_33[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_37::@stepRhoPi_37::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + pod.write %pod_33[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_16[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_15[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_40::@stepRhoPi_40::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + pod.write %pod_15[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_36[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_35[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_43::@stepRhoPi_43::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + pod.write %pod_35[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_8[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_7[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_46::@stepRhoPi_46::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + pod.write %pod_7[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_49::@stepRhoPi_49::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + pod.write %pod_1[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_14[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_13[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_52::@stepRhoPi_52::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + pod.write %pod_13[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_20[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_19[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_55::@stepRhoPi_55::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + pod.write %pod_19[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_46[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_45[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_58::@stepRhoPi_58::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + pod.write %pod_45[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_38[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_37[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_61::@stepRhoPi_61::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + pod.write %pod_37[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_22[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_21[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_64::@stepRhoPi_64::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + pod.write %pod_21[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_26[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_25[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_67::@stepRhoPi_67::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + pod.write %pod_25[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_70::@stepRhoPi_70::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + pod.write %pod_3[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_18[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_17[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_73::@stepRhoPi_73::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + pod.write %pod_17[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_28[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_27[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_76::@stepRhoPi_76::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + pod.write %pod_27[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_6[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_5[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_79::@stepRhoPi_79::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + pod.write %pod_5[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = cast.toindex %24 : !felt.type<"babybear"> + %26 = array.read %arg0[%25] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = cast.toindex %24 : !felt.type<"babybear"> + array.write %nondet[%27] = %26 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + %29 = struct.readm %28[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + %30 = cast.toindex %24 : !felt.type<"babybear"> + %31 = array.read %29[%30] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %24, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %32 : !felt.type<"babybear"> + array.write %nondet[%33] = %31 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + %35 = struct.readm %34[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %36 = cast.toindex %24 : !felt.type<"babybear"> + %37 = array.read %35[%36] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %24, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = cast.toindex %38 : !felt.type<"babybear"> + array.write %nondet[%39] = %37 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + %41 = struct.readm %40[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + %42 = cast.toindex %24 : !felt.type<"babybear"> + %43 = array.read %41[%42] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.add %24, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = cast.toindex %44 : !felt.type<"babybear"> + array.write %nondet[%45] = %43 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + %47 = struct.readm %46[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %48 = cast.toindex %24 : !felt.type<"babybear"> + %49 = array.read %47[%48] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %50 = felt.add %24, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = cast.toindex %50 : !felt.type<"babybear"> + array.write %nondet[%51] = %49 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + %53 = struct.readm %52[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + %54 = cast.toindex %24 : !felt.type<"babybear"> + %55 = array.read %53[%54] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %56 = felt.add %24, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = cast.toindex %56 : !felt.type<"babybear"> + array.write %nondet[%57] = %55 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + %59 = struct.readm %58[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %60 = cast.toindex %24 : !felt.type<"babybear"> + %61 = array.read %59[%60] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %62 = felt.add %24, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = cast.toindex %62 : !felt.type<"babybear"> + array.write %nondet[%63] = %61 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %64 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + %65 = struct.readm %64[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + %66 = cast.toindex %24 : !felt.type<"babybear"> + %67 = array.read %65[%66] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %68 = felt.add %24, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %68 : !felt.type<"babybear"> + array.write %nondet[%69] = %67 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + %71 = struct.readm %70[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %72 = cast.toindex %24 : !felt.type<"babybear"> + %73 = array.read %71[%72] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %74 = felt.add %24, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + array.write %nondet[%75] = %73 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + %77 = struct.readm %76[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %24 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %80 = felt.add %24, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %81 = cast.toindex %80 : !felt.type<"babybear"> + array.write %nondet[%81] = %79 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %82 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + %83 = struct.readm %82[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %84 = cast.toindex %24 : !felt.type<"babybear"> + %85 = array.read %83[%84] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %86 = felt.add %24, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %87 = cast.toindex %86 : !felt.type<"babybear"> + array.write %nondet[%87] = %85 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %88 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + %89 = struct.readm %88[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + %90 = cast.toindex %24 : !felt.type<"babybear"> + %91 = array.read %89[%90] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = felt.add %24, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %93 = cast.toindex %92 : !felt.type<"babybear"> + array.write %nondet[%93] = %91 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %94 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + %95 = struct.readm %94[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %96 = cast.toindex %24 : !felt.type<"babybear"> + %97 = array.read %95[%96] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %98 = felt.add %24, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %99 = cast.toindex %98 : !felt.type<"babybear"> + array.write %nondet[%99] = %97 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %100 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + %101 = struct.readm %100[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + %102 = cast.toindex %24 : !felt.type<"babybear"> + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %104 = felt.add %24, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %105 = cast.toindex %104 : !felt.type<"babybear"> + array.write %nondet[%105] = %103 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %106 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + %107 = struct.readm %106[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %108 = cast.toindex %24 : !felt.type<"babybear"> + %109 = array.read %107[%108] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %110 = felt.add %24, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %111 = cast.toindex %110 : !felt.type<"babybear"> + array.write %nondet[%111] = %109 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %112 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + %113 = struct.readm %112[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + %114 = cast.toindex %24 : !felt.type<"babybear"> + %115 = array.read %113[%114] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %116 = felt.add %24, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %117 = cast.toindex %116 : !felt.type<"babybear"> + array.write %nondet[%117] = %115 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %118 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + %119 = struct.readm %118[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %120 = cast.toindex %24 : !felt.type<"babybear"> + %121 = array.read %119[%120] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %122 = felt.add %24, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %123 = cast.toindex %122 : !felt.type<"babybear"> + array.write %nondet[%123] = %121 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %124 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + %125 = struct.readm %124[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + %126 = cast.toindex %24 : !felt.type<"babybear"> + %127 = array.read %125[%126] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %128 = felt.add %24, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %129 = cast.toindex %128 : !felt.type<"babybear"> + array.write %nondet[%129] = %127 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %130 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + %131 = struct.readm %130[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %132 = cast.toindex %24 : !felt.type<"babybear"> + %133 = array.read %131[%132] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %134 = felt.add %24, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %135 = cast.toindex %134 : !felt.type<"babybear"> + array.write %nondet[%135] = %133 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %136 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + %137 = struct.readm %136[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + %138 = cast.toindex %24 : !felt.type<"babybear"> + %139 = array.read %137[%138] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %140 = felt.add %24, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %141 = cast.toindex %140 : !felt.type<"babybear"> + array.write %nondet[%141] = %139 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %142 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + %143 = struct.readm %142[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %144 = cast.toindex %24 : !felt.type<"babybear"> + %145 = array.read %143[%144] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %146 = felt.add %24, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %147 = cast.toindex %146 : !felt.type<"babybear"> + array.write %nondet[%147] = %145 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %148 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + %149 = struct.readm %148[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + %150 = cast.toindex %24 : !felt.type<"babybear"> + %151 = array.read %149[%150] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %152 = felt.add %24, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %153 = cast.toindex %152 : !felt.type<"babybear"> + array.write %nondet[%153] = %151 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %154 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + %155 = struct.readm %154[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + %156 = cast.toindex %24 : !felt.type<"babybear"> + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %158 = felt.add %24, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %159 = cast.toindex %158 : !felt.type<"babybear"> + array.write %nondet[%159] = %157 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %160 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + %161 = struct.readm %160[@out] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + %162 = cast.toindex %24 : !felt.type<"babybear"> + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %164 = felt.add %24, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %165 = cast.toindex %164 : !felt.type<"babybear"> + array.write %nondet[%165] = %163 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %166 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + %167 = struct.readm %166[@out] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + %168 = cast.toindex %24 : !felt.type<"babybear"> + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %170 = felt.add %24, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %171 = cast.toindex %170 : !felt.type<"babybear"> + array.write %nondet[%171] = %169 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@s17$inputs] = %pod_0 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.writem %self[@s17] = %0 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.writem %self[@s1$inputs] = %pod_6 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + struct.writem %self[@s1] = %1 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + struct.writem %self[@s6$inputs] = %pod_28 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + struct.writem %self[@s6] = %2 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + struct.writem %self[@s4$inputs] = %pod_36 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %3 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.writem %self[@s4] = %3 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.writem %self[@s23$inputs] = %pod_2 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.writem %self[@s23] = %4 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.writem %self[@s7$inputs] = %pod_10 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %5 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.writem %self[@s7] = %5 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.writem %self[@s20$inputs] = %pod_22 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %6 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.writem %self[@s20] = %6 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.writem %self[@s15$inputs] = %pod_8 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %7 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.writem %self[@s15] = %7 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.writem %self[@s9$inputs] = %pod_18 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %8 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.writem %self[@s9] = %8 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.writem %self[@s21$inputs] = %pod_34 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %9 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.writem %self[@s21] = %9 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.writem %self[@s2$inputs] = %pod_38 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %10 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.writem %self[@s2] = %10 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.writem %self[@s8$inputs] = %pod_42 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %11 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.writem %self[@s8] = %11 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.writem %self[@s12$inputs] = %pod_46 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %12 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.writem %self[@s12] = %12 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.writem %self[@s18$inputs] = %pod_30 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %13 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.writem %self[@s18] = %13 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.writem %self[@s14$inputs] = %pod_26 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %14 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.writem %self[@s14] = %14 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.writem %self[@s11$inputs] = %pod_44 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %15 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.writem %self[@s11] = %15 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.writem %self[@s24$inputs] = %pod_16 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %16 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.writem %self[@s24] = %16 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.writem %self[@s3$inputs] = %pod_12 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %17 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.writem %self[@s3] = %17 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.writem %self[@s13$inputs] = %pod_20 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %18 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.writem %self[@s13] = %18 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.writem %self[@s5$inputs] = %pod_32 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %19 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.writem %self[@s5] = %19 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.writem %self[@s22$inputs] = %pod_4 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %20 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.writem %self[@s22] = %20 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.writem %self[@s10$inputs] = %pod_24 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %21 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.writem %self[@s10] = %21 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.writem %self[@s16$inputs] = %pod_40 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %22 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.writem %self[@s16] = %22 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.writem %self[@s19$inputs] = %pod_14 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %23 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.writem %self[@s19] = %23 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.writem %self[@out] = %nondet : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> + function.return %self : !struct.type<@RhoPi_80::@RhoPi_80<[]>> + } + function.def @constrain(%arg0: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_384 = felt.const 384 : <"babybear"> + %felt_const_576 = felt.const 576 : <"babybear"> + %felt_const_1408 = felt.const 1408 : <"babybear"> + %felt_const_896 = felt.const 896 : <"babybear"> + %felt_const_1280 = felt.const 1280 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_768 = felt.const 768 : <"babybear"> + %felt_const_832 = felt.const 832 : <"babybear"> + %felt_const_1216 = felt.const 1216 : <"babybear"> + %felt_const_1472 = felt.const 1472 : <"babybear"> + %felt_const_960 = felt.const 960 : <"babybear"> + %felt_const_256 = felt.const 256 : <"babybear"> + %felt_const_1536 = felt.const 1536 : <"babybear"> + %felt_const_1344 = felt.const 1344 : <"babybear"> + %felt_const_512 = felt.const 512 : <"babybear"> + %felt_const_1024 = felt.const 1024 : <"babybear"> + %felt_const_320 = felt.const 320 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_1152 = felt.const 1152 : <"babybear"> + %felt_const_1088 = felt.const 1088 : <"babybear"> + %felt_const_704 = felt.const 704 : <"babybear"> + %felt_const_448 = felt.const 448 : <"babybear"> + %felt_const_640 = felt.const 640 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@s17] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + %2 = struct.readm %arg0[@s17$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@s23] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + %4 = struct.readm %arg0[@s23$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@s22] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + %6 = struct.readm %arg0[@s22$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %7 = struct.readm %arg0[@s1] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + %8 = struct.readm %arg0[@s1$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %9 = struct.readm %arg0[@s15] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + %10 = struct.readm %arg0[@s15$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %11 = struct.readm %arg0[@s7] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + %12 = struct.readm %arg0[@s7$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %13 = struct.readm %arg0[@s3] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + %14 = struct.readm %arg0[@s3$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %15 = struct.readm %arg0[@s19] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + %16 = struct.readm %arg0[@s19$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %17 = struct.readm %arg0[@s24] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + %18 = struct.readm %arg0[@s24$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %19 = struct.readm %arg0[@s9] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + %20 = struct.readm %arg0[@s9$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %21 = struct.readm %arg0[@s13] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + %22 = struct.readm %arg0[@s13$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %23 = struct.readm %arg0[@s20] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + %24 = struct.readm %arg0[@s20$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %25 = struct.readm %arg0[@s10] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + %26 = struct.readm %arg0[@s10$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %27 = struct.readm %arg0[@s14] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + %28 = struct.readm %arg0[@s14$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %29 = struct.readm %arg0[@s6] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + %30 = struct.readm %arg0[@s6$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %31 = struct.readm %arg0[@s18] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + %32 = struct.readm %arg0[@s18$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %33 = struct.readm %arg0[@s5] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + %34 = struct.readm %arg0[@s5$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %35 = struct.readm %arg0[@s21] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + %36 = struct.readm %arg0[@s21$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %37 = struct.readm %arg0[@s4] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + %38 = struct.readm %arg0[@s4$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %39 = struct.readm %arg0[@s2] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + %40 = struct.readm %arg0[@s2$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %41 = struct.readm %arg0[@s16] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + %42 = struct.readm %arg0[@s16$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %43 = struct.readm %arg0[@s8] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + %44 = struct.readm %arg0[@s8$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %45 = struct.readm %arg0[@s11] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + %46 = struct.readm %arg0[@s11$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %47 = struct.readm %arg0[@s12] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + %48 = struct.readm %arg0[@s12$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = cast.toindex %73 : !felt.type<"babybear"> + %75 = array.read %arg1[%74] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = cast.toindex %73 : !felt.type<"babybear"> + %77 = array.read %0[%76] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %77, %75 : !felt.type<"babybear">, !felt.type<"babybear"> + %78 = struct.readm %25[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + %79 = cast.toindex %73 : !felt.type<"babybear"> + %80 = array.read %78[%79] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %81 = felt.add %73, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = cast.toindex %81 : !felt.type<"babybear"> + %83 = array.read %0[%82] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %84 = struct.readm %11[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %85 = cast.toindex %73 : !felt.type<"babybear"> + %86 = array.read %84[%85] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %87 = felt.add %73, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %88 = cast.toindex %87 : !felt.type<"babybear"> + %89 = array.read %0[%88] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> + %90 = struct.readm %45[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + %91 = cast.toindex %73 : !felt.type<"babybear"> + %92 = array.read %90[%91] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %93 = felt.add %73, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = cast.toindex %93 : !felt.type<"babybear"> + %95 = array.read %0[%94] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %95, %92 : !felt.type<"babybear">, !felt.type<"babybear"> + %96 = struct.readm %1[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %97 = cast.toindex %73 : !felt.type<"babybear"> + %98 = array.read %96[%97] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %99 = felt.add %73, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %100 = cast.toindex %99 : !felt.type<"babybear"> + %101 = array.read %0[%100] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %101, %98 : !felt.type<"babybear">, !felt.type<"babybear"> + %102 = struct.readm %31[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + %103 = cast.toindex %73 : !felt.type<"babybear"> + %104 = array.read %102[%103] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %105 = felt.add %73, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %106 = cast.toindex %105 : !felt.type<"babybear"> + %107 = array.read %0[%106] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %107, %104 : !felt.type<"babybear">, !felt.type<"babybear"> + %108 = struct.readm %13[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %109 = cast.toindex %73 : !felt.type<"babybear"> + %110 = array.read %108[%109] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %111 = felt.add %73, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = cast.toindex %111 : !felt.type<"babybear"> + %113 = array.read %0[%112] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %113, %110 : !felt.type<"babybear">, !felt.type<"babybear"> + %114 = struct.readm %33[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + %115 = cast.toindex %73 : !felt.type<"babybear"> + %116 = array.read %114[%115] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %117 = felt.add %73, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %118 = cast.toindex %117 : !felt.type<"babybear"> + %119 = array.read %0[%118] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %119, %116 : !felt.type<"babybear">, !felt.type<"babybear"> + %120 = struct.readm %41[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %121 = cast.toindex %73 : !felt.type<"babybear"> + %122 = array.read %120[%121] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %123 = felt.add %73, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %124 = cast.toindex %123 : !felt.type<"babybear"> + %125 = array.read %0[%124] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %125, %122 : !felt.type<"babybear">, !felt.type<"babybear"> + %126 = struct.readm %43[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + %127 = cast.toindex %73 : !felt.type<"babybear"> + %128 = array.read %126[%127] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %129 = felt.add %73, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %130 = cast.toindex %129 : !felt.type<"babybear"> + %131 = array.read %0[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> + %132 = struct.readm %35[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %133 = cast.toindex %73 : !felt.type<"babybear"> + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %135 = felt.add %73, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %136 = cast.toindex %135 : !felt.type<"babybear"> + %137 = array.read %0[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> + %138 = struct.readm %17[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + %139 = cast.toindex %73 : !felt.type<"babybear"> + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %141 = felt.add %73, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %142 = cast.toindex %141 : !felt.type<"babybear"> + %143 = array.read %0[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> + %144 = struct.readm %37[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %145 = cast.toindex %73 : !felt.type<"babybear"> + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %147 = felt.add %73, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %148 = cast.toindex %147 : !felt.type<"babybear"> + %149 = array.read %0[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> + %150 = struct.readm %9[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + %151 = cast.toindex %73 : !felt.type<"babybear"> + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %153 = felt.add %73, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %154 = cast.toindex %153 : !felt.type<"babybear"> + %155 = array.read %0[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> + %156 = struct.readm %3[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %157 = cast.toindex %73 : !felt.type<"babybear"> + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %159 = felt.add %73, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %160 = cast.toindex %159 : !felt.type<"babybear"> + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> + %162 = struct.readm %15[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + %163 = cast.toindex %73 : !felt.type<"babybear"> + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %165 = felt.add %73, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %166 = cast.toindex %165 : !felt.type<"babybear"> + %167 = array.read %0[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> + %168 = struct.readm %21[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %169 = cast.toindex %73 : !felt.type<"babybear"> + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %171 = felt.add %73, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %172 = cast.toindex %171 : !felt.type<"babybear"> + %173 = array.read %0[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> + %174 = struct.readm %47[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + %175 = cast.toindex %73 : !felt.type<"babybear"> + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %177 = felt.add %73, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %178 = cast.toindex %177 : !felt.type<"babybear"> + %179 = array.read %0[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> + %180 = struct.readm %39[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %181 = cast.toindex %73 : !felt.type<"babybear"> + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %183 = felt.add %73, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %184 = cast.toindex %183 : !felt.type<"babybear"> + %185 = array.read %0[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> + %186 = struct.readm %23[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + %187 = cast.toindex %73 : !felt.type<"babybear"> + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %189 = felt.add %73, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %190 = cast.toindex %189 : !felt.type<"babybear"> + %191 = array.read %0[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> + %192 = struct.readm %27[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %193 = cast.toindex %73 : !felt.type<"babybear"> + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %195 = felt.add %73, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %196 = cast.toindex %195 : !felt.type<"babybear"> + %197 = array.read %0[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> + %198 = struct.readm %5[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + %199 = cast.toindex %73 : !felt.type<"babybear"> + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %201 = felt.add %73, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %202 = cast.toindex %201 : !felt.type<"babybear"> + %203 = array.read %0[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> + %204 = struct.readm %19[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + %205 = cast.toindex %73 : !felt.type<"babybear"> + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %207 = felt.add %73, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %208 = cast.toindex %207 : !felt.type<"babybear"> + %209 = array.read %0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> + %210 = struct.readm %29[@out] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + %211 = cast.toindex %73 : !felt.type<"babybear"> + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %213 = felt.add %73, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %214 = cast.toindex %213 : !felt.type<"babybear"> + %215 = array.read %0[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> + %216 = struct.readm %7[@out] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + %217 = cast.toindex %73 : !felt.type<"babybear"> + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %219 = felt.add %73, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %220 = cast.toindex %219 : !felt.type<"babybear"> + %221 = array.read %0[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %49 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_19::@stepRhoPi_19::@constrain(%1, %49) : (!struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %50 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_79::@stepRhoPi_79::@constrain(%7, %50) : (!struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %51 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_76::@stepRhoPi_76::@constrain(%29, %51) : (!struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %52 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_43::@stepRhoPi_43::@constrain(%37, %52) : (!struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %53 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_49::@stepRhoPi_49::@constrain(%3, %53) : (!struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %54 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_13::@stepRhoPi_13::@constrain(%11, %54) : (!struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %55 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_64::@stepRhoPi_64::@constrain(%23, %55) : (!struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %56 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_46::@stepRhoPi_46::@constrain(%9, %56) : (!struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %57 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_73::@stepRhoPi_73::@constrain(%19, %57) : (!struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %58 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_37::@stepRhoPi_37::@constrain(%35, %58) : (!struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %59 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_61::@stepRhoPi_61::@constrain(%39, %59) : (!struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %60 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_34::@stepRhoPi_34::@constrain(%43, %60) : (!struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %61 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_58::@stepRhoPi_58::@constrain(%47, %61) : (!struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %62 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_22::@stepRhoPi_22::@constrain(%31, %62) : (!struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %63 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_67::@stepRhoPi_67::@constrain(%27, %63) : (!struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %64 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_16::@stepRhoPi_16::@constrain(%45, %64) : (!struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %65 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_40::@stepRhoPi_40::@constrain(%17, %65) : (!struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %66 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_25::@stepRhoPi_25::@constrain(%13, %66) : (!struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %67 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_55::@stepRhoPi_55::@constrain(%21, %67) : (!struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %68 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_28::@stepRhoPi_28::@constrain(%33, %68) : (!struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %69 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_70::@stepRhoPi_70::@constrain(%5, %69) : (!struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %70 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_10::@stepRhoPi_10::@constrain(%25, %70) : (!struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %71 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_31::@stepRhoPi_31::@constrain(%41, %71) : (!struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %72 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_52::@stepRhoPi_52::@constrain(%15, %72) : (!struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @XorArraySingle_81 { + struct.def @XorArraySingle_81 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArraySingle_81::@XorArraySingle_81<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %19 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %21 = function.call @XOR_1::@XOR_1::@compute(%19, %20) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %21 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %22 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%22] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %array_0[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %12[@b] = %felt_const_1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%13] = %12 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = array.read %array[%14] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.subi %16, %c1 : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.cmpi eq, %17, %c0 : index + scf.if %18 { + %19 = pod.read %12[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %21 = function.call @XOR_1::@XOR_1::@compute(%19, %20) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %15[@comp] = %21 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %22 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%22] = %15 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg1] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %2[%9] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %11 = pod.read %10[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg2] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg2] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @AND_82 { + struct.def @AND_82 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@AND_82::@AND_82<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_82::@AND_82<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_82::@AND_82<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_82::@AND_82<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @AndArray_83 { + struct.def @AndArray_83 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@AND_82::@AND_82<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_83::@AndArray_83<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@AndArray_83::@AndArray_83<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @AND_82::@AND_82::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_82::@AND_82<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @AND_82::@AND_82::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_82::@AND_82<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + %4 = struct.readm %3[@out] : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@AND_82::@AND_82<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@AND_82::@AND_82<[]>>>, !struct.type<@AND_82::@AND_82<[]>> + } + struct.writem %self[@aux] = %array_1 : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !struct.type<@AND_82::@AND_82<[]>>> + struct.writem %self[@out] = %nondet : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@AndArray_83::@AndArray_83<[]>> + } + function.def @constrain(%arg0: !struct.type<@AndArray_83::@AndArray_83<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !struct.type<@AND_82::@AND_82<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@AND_82::@AND_82<[]>>>, !struct.type<@AND_82::@AND_82<[]>> + %6 = struct.readm %5[@out] : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@AND_82::@AND_82<[]>>>, !struct.type<@AND_82::@AND_82<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_82::@AND_82::@constrain(%3, %5, %6) : (!struct.type<@AND_82::@AND_82<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @stepChi_84 { + struct.def @stepChi_84 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @bXor : !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + struct.member @bXor$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @abc : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @abc$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @bc : !struct.type<@AndArray_83::@AndArray_83<[]>> + struct.member @bc$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepChi_84::@stepChi_84<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @XorArraySingle_81::@XorArraySingle_81::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + %5 = struct.readm %4[@out] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @AndArray_83::@AndArray_83::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_83::@AndArray_83<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_3[@count] = %18 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @AndArray_83::@AndArray_83::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_83::@AndArray_83<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %11 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + %12 = struct.readm %11[@out] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@bXor$inputs] = %pod_0 : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + struct.writem %self[@bXor] = %0 : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + struct.writem %self[@bc$inputs] = %pod_4 : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + struct.writem %self[@bc] = %1 : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@AndArray_83::@AndArray_83<[]>> + struct.writem %self[@abc$inputs] = %pod_2 : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@abc] = %2 : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@out] = %nondet : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepChi_84::@stepChi_84<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepChi_84::@stepChi_84<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@bXor] : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + %2 = struct.readm %arg0[@bXor$inputs] : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@abc] : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %4 = struct.readm %arg0[@abc$inputs] : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@bc] : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@AndArray_83::@AndArray_83<[]>> + %6 = struct.readm %arg0[@bc$inputs] : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = struct.readm %1[@out] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %12 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %12 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %arg3[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg1[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %12 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %0[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArraySingle_81::@XorArraySingle_81::@constrain(%1, %7) : (!struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @AndArray_83::@AndArray_83::@constrain(%5, %8, %9) : (!struct.type<@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%3, %10, %11) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Chi_85 { + struct.def @Chi_85 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @r22 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r13 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r23 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r24 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r18 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r14 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r6 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r8 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r17 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r0 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r11 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r1 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r12 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r16 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r5 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r19 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r20 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r9 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r2 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r10 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r3 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r15 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r4 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r7 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r21 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c192 = arith.constant {product_source = "compute"} 192 : index + %self = struct.new : <@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %153 = array.read %arg0[%152] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %154 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %154[%155] = %153 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %154 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %157 = arith.subi %156, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %157 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.cmpi eq, %157, %c0 {product_source = "compute"} : index + scf.if %158 { + %175 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %159 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "compute"} + %161 = array.read %arg0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %162 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %162[%163] = %161 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %162 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %165 = arith.subi %164, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %165 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.cmpi eq, %165, %c0 {product_source = "compute"} : index + scf.if %166 { + %175 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %167 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %arg0[%168] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %170[%171] = %169 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %170 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %173 = arith.subi %172, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %173 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.cmpi eq, %173, %c0 {product_source = "compute"} : index + scf.if %174 { + %175 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %175 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %161 = array.read %arg0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %162 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %162[%163] = %161 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %162 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %165 = arith.subi %164, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %165 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.cmpi eq, %165, %c0 {product_source = "compute"} : index + scf.if %166 { + %175 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %167 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %arg0[%168] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %170[%171] = %169 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@c] = %170 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %173 = arith.subi %172, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %173 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.cmpi eq, %173, %c0 {product_source = "compute"} : index + scf.if %174 { + %175 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %153 = struct.readm %152[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %154 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %155 = array.read %153[%154] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%156] = %155 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %157 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %158 = struct.readm %157[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %159 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %160 = array.read %158[%159] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %162 = cast.toindex %161 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%162] = %160 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %164 = struct.readm %163[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %166 = array.read %164[%165] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%168] = %166 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %169 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %170 = struct.readm %169[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %172 = array.read %170[%171] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %174 = cast.toindex %173 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%174] = %172 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %175 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %176 = struct.readm %175[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %178 = array.read %176[%177] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %179 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %180 = cast.toindex %179 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%180] = %178 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %181 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %182 = struct.readm %181[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %183 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %184 = array.read %182[%183] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %185 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %186 = cast.toindex %185 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%186] = %184 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %187 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %188 = struct.readm %187[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %189 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %190 = array.read %188[%189] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %191 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%192] = %190 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %193 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %194 = struct.readm %193[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %197 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %198 = cast.toindex %197 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%198] = %196 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %199 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %200 = struct.readm %199[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %201 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %204 = cast.toindex %203 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%204] = %202 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %206 = struct.readm %205[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %208 = array.read %206[%207] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %209 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %210 = cast.toindex %209 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%210] = %208 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %212 = struct.readm %211[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %214 = array.read %212[%213] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %215 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%216] = %214 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %217 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %218 = struct.readm %217[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %219 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %220 = array.read %218[%219] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %221 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %222 = cast.toindex %221 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%222] = %220 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %223 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %224 = struct.readm %223[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %225 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %224[%225] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %228 = cast.toindex %227 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%228] = %226 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %229 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %230 = struct.readm %229[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %231 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %232 = array.read %230[%231] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %233 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %234 = cast.toindex %233 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%234] = %232 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %235 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %236 = struct.readm %235[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %238 = array.read %236[%237] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %239 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %240 = cast.toindex %239 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%240] = %238 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %241 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %242 = struct.readm %241[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %243 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %244 = array.read %242[%243] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %245 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %246 = cast.toindex %245 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%246] = %244 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %247 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %248 = struct.readm %247[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %249 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %250 = array.read %248[%249] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %251 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %252 = cast.toindex %251 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%252] = %250 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %253 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %254 = struct.readm %253[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %255 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %256 = array.read %254[%255] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %257 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %258 = cast.toindex %257 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%258] = %256 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %259 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %260 = struct.readm %259[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %261 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %262 = array.read %260[%261] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %263 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %264 = cast.toindex %263 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%264] = %262 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %265 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %266 = struct.readm %265[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %267 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %268 = array.read %266[%267] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %269 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %270 = cast.toindex %269 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%270] = %268 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %271 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %272 = struct.readm %271[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %273 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %274 = array.read %272[%273] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %275 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %276 = cast.toindex %275 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%276] = %274 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %277 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %278 = struct.readm %277[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %279 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %280 = array.read %278[%279] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %281 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %282 = cast.toindex %281 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%282] = %280 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %283 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %284 = struct.readm %283[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %285 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %286 = array.read %284[%285] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %287 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %288 = cast.toindex %287 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%288] = %286 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %289 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %290 = struct.readm %289[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %291 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %292 = array.read %290[%291] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %293 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %294 = cast.toindex %293 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%294] = %292 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %295 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %296 = struct.readm %295[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %297 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %298 = array.read %296[%297] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %299 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %300 = cast.toindex %299 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%300] = %298 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_48 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %0 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_20 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %1 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_30 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %2 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_14 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %3 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_34 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %4 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_44 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %5 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_22 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %6 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_4 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %7 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_28 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %8 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_40 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %9 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_24 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %10 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_12 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %11 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_26 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %12 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_0 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %13 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_8 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %14 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_10 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %15 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_46 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %16 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_36 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %17 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_6 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %18 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_2 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %19 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_16 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %20 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_18 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %21 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_32 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %22 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_38 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %23 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_42 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %24 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %25 = struct.readm %self[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = struct.readm %self[@r22] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %27 = struct.readm %self[@r22$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = struct.readm %self[@r13] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %29 = struct.readm %self[@r13$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %30 = struct.readm %self[@r23] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %31 = struct.readm %self[@r23$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %32 = struct.readm %self[@r24] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %33 = struct.readm %self[@r24$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = struct.readm %self[@r18] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %35 = struct.readm %self[@r18$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %36 = struct.readm %self[@r14] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@r14$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = struct.readm %self[@r6] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@r6$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@r8] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@r8$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@r17] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@r17$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %44 = struct.readm %self[@r0] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@r0$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@r11] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@r11$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@r1] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@r1$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@r12] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@r12$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %52 = struct.readm %self[@r16] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %53 = struct.readm %self[@r16$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = struct.readm %self[@r5] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %55 = struct.readm %self[@r5$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %56 = struct.readm %self[@r19] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %57 = struct.readm %self[@r19$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = struct.readm %self[@r20] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %59 = struct.readm %self[@r20$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %60 = struct.readm %self[@r9] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %61 = struct.readm %self[@r9$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %62 = struct.readm %self[@r2] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %63 = struct.readm %self[@r2$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %64 = struct.readm %self[@r10] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %65 = struct.readm %self[@r10$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %66 = struct.readm %self[@r3] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %67 = struct.readm %self[@r3$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %68 = struct.readm %self[@r15] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %69 = struct.readm %self[@r15$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %70 = struct.readm %self[@r4] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %71 = struct.readm %self[@r4$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %72 = struct.readm %self[@r7] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %73 = struct.readm %self[@r7$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %74 = struct.readm %self[@r21] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %75 = struct.readm %self[@r21$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %153 = array.read %arg0[%152] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %154 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %156 = array.read %154[%155] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %156, %153 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg0[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg0[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %49[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %63[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %67[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg0[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg0[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %71[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %73[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %41[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %61[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %51[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %29[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %29[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %29[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %69[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %43[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %35[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %35[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %35[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %75[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %27[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %27[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %27[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %31[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %31[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %31[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %33[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %33[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %33[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = struct.readm %44[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %152[%153] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %156 = array.read %25[%155] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %156, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %48[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %25[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %62[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %167 = cast.toindex %166 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %25[%167] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = struct.readm %66[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %170 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %169[%170] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %173 = cast.toindex %172 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %25[%173] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = struct.readm %70[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %176 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %175[%176] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %179 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %25[%179] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = struct.readm %54[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %182 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %181[%182] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %185 = cast.toindex %184 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %25[%185] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %187 = struct.readm %38[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %188 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %189 = array.read %187[%188] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %190 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %191 = cast.toindex %190 : !felt.type<"babybear"> {product_source = "constrain"} + %192 = array.read %25[%191] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %192, %189 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = struct.readm %72[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %194 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %196 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "constrain"} + %198 = array.read %25[%197] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %198, %195 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = struct.readm %40[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %200 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %201 = array.read %199[%200] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %202 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %203 = cast.toindex %202 : !felt.type<"babybear"> {product_source = "constrain"} + %204 = array.read %25[%203] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %204, %201 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = struct.readm %60[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %206 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %207 = array.read %205[%206] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %208 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "constrain"} + %210 = array.read %25[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %210, %207 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = struct.readm %64[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %212 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %213 = array.read %211[%212] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %214 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %215 = cast.toindex %214 : !felt.type<"babybear"> {product_source = "constrain"} + %216 = array.read %25[%215] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %216, %213 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = struct.readm %46[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %218 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %219 = array.read %217[%218] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %220 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %221 = cast.toindex %220 : !felt.type<"babybear"> {product_source = "constrain"} + %222 = array.read %25[%221] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %222, %219 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %223 = struct.readm %50[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %224 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %225 = array.read %223[%224] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %226 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %227 = cast.toindex %226 : !felt.type<"babybear"> {product_source = "constrain"} + %228 = array.read %25[%227] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %228, %225 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %229 = struct.readm %28[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %230 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %231 = array.read %229[%230] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %232 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %233 = cast.toindex %232 : !felt.type<"babybear"> {product_source = "constrain"} + %234 = array.read %25[%233] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %234, %231 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %235 = struct.readm %36[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %236 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %237 = array.read %235[%236] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %238 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %239 = cast.toindex %238 : !felt.type<"babybear"> {product_source = "constrain"} + %240 = array.read %25[%239] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %240, %237 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %241 = struct.readm %68[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %242 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %243 = array.read %241[%242] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %244 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %245 = cast.toindex %244 : !felt.type<"babybear"> {product_source = "constrain"} + %246 = array.read %25[%245] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %246, %243 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %247 = struct.readm %52[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %248 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %249 = array.read %247[%248] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %250 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %251 = cast.toindex %250 : !felt.type<"babybear"> {product_source = "constrain"} + %252 = array.read %25[%251] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %252, %249 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %253 = struct.readm %42[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %254 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %255 = array.read %253[%254] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %256 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %257 = cast.toindex %256 : !felt.type<"babybear"> {product_source = "constrain"} + %258 = array.read %25[%257] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %258, %255 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %259 = struct.readm %34[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %260 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %261 = array.read %259[%260] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %262 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %263 = cast.toindex %262 : !felt.type<"babybear"> {product_source = "constrain"} + %264 = array.read %25[%263] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %264, %261 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %265 = struct.readm %56[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %266 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %267 = array.read %265[%266] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %268 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %269 = cast.toindex %268 : !felt.type<"babybear"> {product_source = "constrain"} + %270 = array.read %25[%269] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %270, %267 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %271 = struct.readm %58[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %272 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %273 = array.read %271[%272] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %274 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %275 = cast.toindex %274 : !felt.type<"babybear"> {product_source = "constrain"} + %276 = array.read %25[%275] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %276, %273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %277 = struct.readm %74[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %278 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %279 = array.read %277[%278] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %280 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %281 = cast.toindex %280 : !felt.type<"babybear"> {product_source = "constrain"} + %282 = array.read %25[%281] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %282, %279 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %283 = struct.readm %26[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %284 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %285 = array.read %283[%284] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %286 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %287 = cast.toindex %286 : !felt.type<"babybear"> {product_source = "constrain"} + %288 = array.read %25[%287] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %288, %285 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %289 = struct.readm %30[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %290 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %291 = array.read %289[%290] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %292 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %293 = cast.toindex %292 : !felt.type<"babybear"> {product_source = "constrain"} + %294 = array.read %25[%293] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %294, %291 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %295 = struct.readm %32[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %296 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %297 = array.read %295[%296] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %298 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %299 = cast.toindex %298 : !felt.type<"babybear"> {product_source = "constrain"} + %300 = array.read %25[%299] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %300, %297 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %76 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %75[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%74, %76, %77, %78) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %79 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%46, %79, %80, %81) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %82 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%56, %82, %83, %84) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %85 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %87 = pod.read %41[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%40, %85, %86, %87) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %88 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = pod.read %61[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%60, %88, %89, %90) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %91 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %93 = pod.read %71[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%70, %91, %92, %93) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %94 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %95 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %96 = pod.read %49[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%48, %94, %95, %96) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %97 = pod.read %31[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %31[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %99 = pod.read %31[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%30, %97, %98, %99) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %100 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %101 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%54, %100, %101, %102) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %103 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %105 = pod.read %67[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%66, %103, %104, %105) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %106 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %108 = pod.read %51[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%50, %106, %107, %108) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %109 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%38, %109, %110, %111) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %114 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%52, %112, %113, %114) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %115 = pod.read %27[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %27[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %117 = pod.read %27[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%26, %115, %116, %117) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %118 = pod.read %35[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %35[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %35[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%34, %118, %119, %120) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %121 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%36, %121, %122, %123) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %124 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %126 = pod.read %73[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%72, %124, %125, %126) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %127 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %63[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%62, %127, %128, %129) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %130 = pod.read %33[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %33[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = pod.read %33[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%32, %130, %131, %132) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %133 = pod.read %29[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %134 = pod.read %29[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %29[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%28, %133, %134, %135) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = pod.read %43[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%42, %136, %137, %138) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %139 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%44, %139, %140, %141) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %142 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%58, %142, %143, %144) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %145 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %147 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%64, %145, %146, %147) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %148 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %150 = pod.read %69[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%68, %148, %149, %150) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Chi_85::@Chi_85<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c192 = arith.constant {product_source = "compute"} 192 : index + %self = struct.new : <@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %31 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %49 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %33 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %arg0[%34] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %36 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %39 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg0[%42] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45] = %43 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %44 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %47 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %49 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %49 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %arg0[%34] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %36 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %39 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg0[%42] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45] = %43 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@c] = %44 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %47 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %49 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %27 = struct.readm %26[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %27[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%30] = %29 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %32[%33] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%36] = %34 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %38[%39] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %40 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %44[%45] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%48] = %46 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %50 = struct.readm %49[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %50[%51] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %52 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %56 = struct.readm %55[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %56[%57] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%60] = %58 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %62[%63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%66] = %64 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %67 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %68 = struct.readm %67[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %69 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %68[%69] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%72] = %70 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %74 = struct.readm %73[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %75 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %74[%75] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%78] = %76 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %80 = struct.readm %79[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %80[%81] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%84] = %82 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %87 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %86[%87] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %89 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%90] = %88 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %92 = struct.readm %91[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %92[%93] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %95 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %95 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%96] = %94 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %97 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %99 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %98[%99] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%102] = %100 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %103 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %104 = struct.readm %103[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %105 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %106 = array.read %104[%105] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %107 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %108 = cast.toindex %107 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%108] = %106 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %109 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %110 = struct.readm %109[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %111 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %112 = array.read %110[%111] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %113 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %114 = cast.toindex %113 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%114] = %112 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %115 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %116 = struct.readm %115[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %117 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %116[%117] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %119 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %120 = cast.toindex %119 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%120] = %118 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %121 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %122 = struct.readm %121[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %123 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %122[%123] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %125 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %125 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%126] = %124 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %127 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %128 = struct.readm %127[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %129 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %130 = array.read %128[%129] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %131 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %132 = cast.toindex %131 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%132] = %130 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %134 = struct.readm %133[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %135 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %136 = array.read %134[%135] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %137 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %138 = cast.toindex %137 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%138] = %136 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %139 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %140 = struct.readm %139[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %141 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %142 = array.read %140[%141] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %143 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %144 = cast.toindex %143 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%144] = %142 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %145 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %146 = struct.readm %145[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %147 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %148 = array.read %146[%147] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %149 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %150 = cast.toindex %149 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%150] = %148 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %151 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %152 = struct.readm %151[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %153 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %152[%153] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %156 = cast.toindex %155 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%156] = %154 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %157 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %158 = struct.readm %157[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %159 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %160 = array.read %158[%159] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %162 = cast.toindex %161 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%162] = %160 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %164 = struct.readm %163[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %166 = array.read %164[%165] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%168] = %166 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %169 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %170 = struct.readm %169[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %172 = array.read %170[%171] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %174 = cast.toindex %173 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%174] = %172 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_48 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %0 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_20 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %1 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_30 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %2 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_14 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %3 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_34 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %4 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_44 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %5 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_22 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %6 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_4 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %7 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_28 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %8 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_40 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %9 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_24 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %10 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_12 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %11 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_26 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %12 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_0 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %13 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_8 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %14 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_10 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %15 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_46 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %16 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_36 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %17 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_6 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %18 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_2 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %19 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_16 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %20 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_18 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %21 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_32 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %22 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_38 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %23 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_42 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %24 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Chi_85::@Chi_85<[]>> + } + function.def @constrain(%arg0: !struct.type<@Chi_85::@Chi_85<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@r22] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@r22$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@r13] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@r13$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@r23] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@r23$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@r24] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@r24$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@r18] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@r18$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@r14] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@r14$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@r6] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@r6$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@r8] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@r8$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@r17] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@r17$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@r0] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@r0$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@r11] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@r11$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@r1] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@r1$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@r12] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@r12$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@r16] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@r16$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@r5] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@r5$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@r19] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@r19$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@r20] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@r20$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@r9] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@r9$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@r2] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@r2$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@r10] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@r10$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@r3] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@r3$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@r15] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@r15$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@r4] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@r4$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@r7] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@r7$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %arg0[@r21] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %50 = struct.readm %arg0[@r21$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %128 = array.read %arg1[%127] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %129 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %130 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %129[%130] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = cast.toindex %132 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %arg1[%133] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %135[%136] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %arg1[%139] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %141[%142] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %arg1[%133] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %135[%136] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %arg1[%139] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %141[%142] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = struct.readm %19[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %127[%128] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %0[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = struct.readm %23[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %136 = cast.toindex %135 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %0[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = struct.readm %37[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %142 = cast.toindex %141 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %0[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %144 = struct.readm %41[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %147 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %148 = cast.toindex %147 : !felt.type<"babybear"> {product_source = "constrain"} + %149 = array.read %0[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %150 = struct.readm %45[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %153 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %154 = cast.toindex %153 : !felt.type<"babybear"> {product_source = "constrain"} + %155 = array.read %0[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %156 = struct.readm %29[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %13[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %166 = cast.toindex %165 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %0[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = struct.readm %47[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %172 = cast.toindex %171 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %0[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = struct.readm %15[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %178 = cast.toindex %177 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %0[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = struct.readm %35[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %181 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %184 = cast.toindex %183 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %0[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %186 = struct.readm %39[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %187 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %189 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %190 = cast.toindex %189 : !felt.type<"babybear"> {product_source = "constrain"} + %191 = array.read %0[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %21[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %0[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %25[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %202 = cast.toindex %201 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %0[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = struct.readm %3[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %205 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = struct.readm %11[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %211 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %214 = cast.toindex %213 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %0[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = struct.readm %43[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %217 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %220 = cast.toindex %219 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %0[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %222 = struct.readm %27[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %223 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %224 = array.read %222[%223] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %225 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %226 = cast.toindex %225 : !felt.type<"babybear"> {product_source = "constrain"} + %227 = array.read %0[%226] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %227, %224 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %228 = struct.readm %17[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %229 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %230 = array.read %228[%229] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %231 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %232 = cast.toindex %231 : !felt.type<"babybear"> {product_source = "constrain"} + %233 = array.read %0[%232] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %233, %230 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %234 = struct.readm %9[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %235 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %236 = array.read %234[%235] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %237 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %238 = cast.toindex %237 : !felt.type<"babybear"> {product_source = "constrain"} + %239 = array.read %0[%238] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %239, %236 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %240 = struct.readm %31[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %241 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %242 = array.read %240[%241] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %243 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %244 = cast.toindex %243 : !felt.type<"babybear"> {product_source = "constrain"} + %245 = array.read %0[%244] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %245, %242 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %246 = struct.readm %33[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %247 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %248 = array.read %246[%247] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %249 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %250 = cast.toindex %249 : !felt.type<"babybear"> {product_source = "constrain"} + %251 = array.read %0[%250] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %251, %248 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %252 = struct.readm %49[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %253 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %254 = array.read %252[%253] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %255 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %256 = cast.toindex %255 : !felt.type<"babybear"> {product_source = "constrain"} + %257 = array.read %0[%256] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %257, %254 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %258 = struct.readm %1[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %259 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %260 = array.read %258[%259] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %261 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %262 = cast.toindex %261 : !felt.type<"babybear"> {product_source = "constrain"} + %263 = array.read %0[%262] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %263, %260 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %264 = struct.readm %5[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %265 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %266 = array.read %264[%265] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %267 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %268 = cast.toindex %267 : !felt.type<"babybear"> {product_source = "constrain"} + %269 = array.read %0[%268] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %269, %266 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %270 = struct.readm %7[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %271 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %272 = array.read %270[%271] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %273 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %274 = cast.toindex %273 : !felt.type<"babybear"> {product_source = "constrain"} + %275 = array.read %0[%274] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %275, %272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %51 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%49, %51, %52, %53) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %54 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%21, %54, %55, %56) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %57 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = pod.read %32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%31, %57, %58, %59) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %60 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = pod.read %16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%15, %60, %61, %62) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %63 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = pod.read %36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%35, %63, %64, %65) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %66 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = pod.read %46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%45, %66, %67, %68) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %69 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %70 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%23, %69, %70, %71) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %72 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %73 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%5, %72, %73, %74) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%29, %75, %76, %77) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %78 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %79 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%41, %78, %79, %80) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %81 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%25, %81, %82, %83) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %84 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %85 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%13, %84, %85, %86) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %87 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%27, %87, %88, %89) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %90 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %91 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%1, %90, %91, %92) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %94 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %95 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%9, %93, %94, %95) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %96 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %97 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%11, %96, %97, %98) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %99 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %100 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %101 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%47, %99, %100, %101) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %102 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %103 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%37, %102, %103, %104) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %105 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %106 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%7, %105, %106, %107) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %108 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%3, %108, %109, %110) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %111 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %112 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%17, %111, %112, %113) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %114 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%19, %114, %115, %116) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %117 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %118 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%33, %117, %118, %119) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %120 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%39, %120, %121, %122) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %123 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%43, %123, %124, %125) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @RC_86 { + struct.def @RC_86 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@RC_86::@RC_86<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_86::@RC_86<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %felt_const_1, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.shr %felt_const_1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.bit_and %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@RC_86::@RC_86<[]>> + } + function.def @compute() -> !struct.type<@RC_86::@RC_86<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_86::@RC_86<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %2 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@RC_86::@RC_86<[]>> + } + function.def @constrain(%arg0: !struct.type<@RC_86::@RC_86<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "constrain"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "constrain"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "constrain"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "constrain"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "constrain"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.shr %felt_const_1, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Iota_87 { + struct.def @Iota_87 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @iota : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @iota$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @rc : !struct.type<@RC_86::@RC_86<[]>> + struct.member @rc$inputs : !pod.type<[]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_86::@RC_86::@product() : () -> !struct.type<@RC_86::@RC_86<[]>> + %1 = function.call @RC_86::@RC_86::@compute() : () -> !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %14 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %23 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %26 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_0 : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %2 : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_3 : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "compute"} + %3 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %3 : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@iota] : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@iota$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@rc] : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@rc$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %7[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %4[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %4[%14] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%5, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.call @RC_86::@RC_86::@constrain(%7) : (!struct.type<@RC_86::@RC_86<[]>>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Iota_87::@Iota_87<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_86::@RC_86::@compute() : () -> !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_0 : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %1 : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_3 : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "compute"} + %2 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %2 : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Iota_87::@Iota_87<[]>> + } + function.def @constrain(%arg0: !struct.type<@Iota_87::@Iota_87<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1600 = arith.constant 1600 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@iota] : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@iota$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@rc] : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@rc$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %3[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c64 to %c1600 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%1, %5, %6) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.call @RC_86::@RC_86::@constrain(%3) : (!struct.type<@RC_86::@RC_86<[]>>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @KeccakfRound_88 { + struct.def @KeccakfRound_88 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @rhopi : !struct.type<@RhoPi_80::@RhoPi_80<[]>> + struct.member @rhopi$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + struct.member @theta : !struct.type<@Theta_9::@Theta_9<[]>> + struct.member @theta$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + struct.member @chi : !struct.type<@Chi_85::@Chi_85<[]>> + struct.member @chi$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + struct.member @iota : !struct.type<@Iota_87::@Iota_87<[]>> + struct.member @iota$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c1600 = arith.constant {product_source = "compute"} 1600 : index + %self = struct.new : <@KeccakfRound_88::@KeccakfRound_88<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg0[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %20 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @Theta_9::@Theta_9::@product(%25) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> + %27 = function.call @Theta_9::@Theta_9::@compute(%25) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %26 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %22 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %25 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @RhoPi_80::@RhoPi_80::@compute(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %28 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %22 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %25 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Chi_85::@Chi_85::@product(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> + %29 = function.call @Chi_85::@Chi_85::@compute(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %28 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %22 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %25 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Iota_87::@Iota_87::@product(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> + %29 = function.call @Iota_87::@Iota_87::@compute(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %28 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%22] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@chi$inputs] = %pod_4 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@chi] = %0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@theta$inputs] = %pod_2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@theta] = %1 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@rhopi$inputs] = %pod_0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@rhopi] = %2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_6 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %3 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@rhopi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@rhopi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@theta] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@theta$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %self[@chi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "constrain"} + %10 = struct.readm %self[@chi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %self[@iota] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@iota$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %7[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %5[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %10[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %9[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %12[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %11[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %4[%21] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %13 = pod.read %10[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Chi_85::@Chi_85::@constrain(%9, %13) : (!struct.type<@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %14 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Theta_9::@Theta_9::@constrain(%7, %14) : (!struct.type<@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %15 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @RhoPi_80::@RhoPi_80::@constrain(%5, %15) : (!struct.type<@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %16 = pod.read %12[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Iota_87::@Iota_87::@constrain(%11, %16) : (!struct.type<@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c1600 = arith.constant {product_source = "compute"} 1600 : index + %self = struct.new : <@KeccakfRound_88::@KeccakfRound_88<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%5] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%8] = %6 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %7 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %12 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @Theta_9::@Theta_9::@compute(%12) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %13 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %9 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %12 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @RhoPi_80::@RhoPi_80::@compute(%14) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %9 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %12 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @Chi_85::@Chi_85::@compute(%14) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %15 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %9 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %12 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @Iota_87::@Iota_87::@compute(%14) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %15 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@chi$inputs] = %pod_4 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@chi] = %0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@theta$inputs] = %pod_2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@theta] = %1 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@rhopi$inputs] = %pod_0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@rhopi] = %2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_6 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %3 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> + } + function.def @constrain(%arg0: !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c1600 = arith.constant 1600 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@rhopi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@rhopi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@theta] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@theta$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@chi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@chi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@iota] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@iota$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%14] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %3[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %1[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %5[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %7[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%17] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Chi_85::@Chi_85::@constrain(%5, %9) : (!struct.type<@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Theta_9::@Theta_9::@constrain(%3, %10) : (!struct.type<@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @RhoPi_80::@RhoPi_80::@constrain(%1, %11) : (!struct.type<@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Iota_87::@Iota_87::@constrain(%7, %12) : (!struct.type<@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/keccakfRound20_test.llzk b/examples/circom-demo/keccakfRound20_test.llzk new file mode 100644 index 0000000..82cb0b7 --- /dev/null +++ b/examples/circom-demo/keccakfRound20_test.llzk @@ -0,0 +1,23017 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>>} { + poly.template @Xor3_0 { + struct.def @Xor3_0 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @mid : !array.type<64 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Xor3_0::@Xor3_0<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg1[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %0 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %felt_const_1, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %12, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %nondet[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %18, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.mul %8, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = array.read %arg1[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.add %21, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = array.read %arg2[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %nondet[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.mul %29, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.sub %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%32] = %31 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@mid] = %nondet : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_0 : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Xor3_0::@Xor3_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Xor3_0::@Xor3_0<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@mid] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c64 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %1[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg1[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.mul %13, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.mul %17, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = felt.mul %11, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + %26 = array.read %arg2[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %arg3[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.add %27, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %1[%31] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = felt.mul %32, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = felt.sub %30, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %0[%35] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %36, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @XOR_1 { + struct.def @XOR_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_1::@XOR_1<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_1::@XOR_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_1::@XOR_1<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @XorArray_2 { + struct.def @XorArray_2 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArray_2::@XorArray_2<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArray_2::@XorArray_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArray_2::@XorArray_2<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @Xor5_3 { + struct.def @Xor5_3 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @xor4 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @xor4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @xor5 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @xor5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @xor3 : !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.member @xor3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>, %arg4: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c192 = arith.constant 192 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@Xor5_3::@Xor5_3<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod_3[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %3 : !felt.type<"babybear"> + array.write %13[%14] = %12 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %13 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod_3[@count] = %16 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod_3[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + %18 = cast.toindex %3 : !felt.type<"babybear"> + %19 = array.read %arg2[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = cast.toindex %3 : !felt.type<"babybear"> + array.write %20[%21] = %19 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@c] = %20 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %pod_3[@count] = %23 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod_3[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + %5 = struct.readm %4[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg3[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg4[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@xor3$inputs] = %pod_4 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.writem %self[@xor3] = %0 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.writem %self[@xor5$inputs] = %pod_2 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor5] = %1 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor4$inputs] = %pod_0 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor4] = %2 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@out] = %nondet : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Xor5_3::@Xor5_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Xor5_3::@Xor5_3<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>, %arg4: !array.type<64 x !felt.type<"babybear">>, %arg5: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@xor4] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %2 = struct.readm %arg0[@xor4$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@xor5] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %4 = struct.readm %arg0[@xor5$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@xor3] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@Xor3_0::@Xor3_0<[]>> + %6 = struct.readm %arg0[@xor3$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg1[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %14 : !felt.type<"babybear"> + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %14 : !felt.type<"babybear"> + %21 = array.read %arg2[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = cast.toindex %14 : !felt.type<"babybear"> + %24 = array.read %22[%23] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %14 : !felt.type<"babybear"> + %26 = array.read %arg3[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %5[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg4[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = array.read %23[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg5[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = array.read %23[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %14 : !felt.type<"babybear"> + %19 = array.read %0[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @Xor3_0::@Xor3_0::@constrain(%5, %7, %8, %9) : (!struct.type<@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%3, %10, %11) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %12 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%1, %12, %13) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_4 { + struct.def @ShR_4 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_4::@ShR_4<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = array.read %arg0[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_4::@ShR_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_4::@ShR_4<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = array.read %arg1[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_5 { + struct.def @ShL_5 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@ShL_5::@ShL_5<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + array.write %nondet[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_5::@ShL_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_5::@ShL_5<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @OR_6 { + struct.def @OR_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_6::@OR_6<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_6::@OR_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_6::@OR_6<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OrArray_7 { + struct.def @OrArray_7 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@OrArray_7::@OrArray_7<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_6::@OR_6::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_6::@OR_6::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %4 = struct.readm %3[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@OR_6::@OR_6<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + } + struct.writem %self[@aux] = %array_1 : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + struct.writem %self[@out] = %nondet : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@OrArray_7::@OrArray_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@OrArray_7::@OrArray_7<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + %6 = struct.readm %5[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_6::@OR_6::@constrain(%3, %5, %6) : (!struct.type<@OR_6::@OR_6<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @D_8 { + struct.def @D_8 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_5::@ShL_5<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux3 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @aux3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_4::@ShR_4<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@D_8::@D_8<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]> + %pod_6 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_6[@in] = %7 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_5[@count] = %10 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = function.call @ShR_4::@ShR_4::@compute(%12) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> + pod.write %pod_5[@comp] = %13 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %7 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = function.call @ShL_5::@ShL_5::@compute(%12) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + %6 = struct.readm %5[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = cast.toindex %4 : !felt.type<"babybear"> + array.write %9[%10] = %8 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %9 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %pod_3[@count] = %12 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %23 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = function.call @OrArray_7::@OrArray_7::@compute(%23, %24) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %25 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + %15 = struct.readm %14[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %4 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %4 : !felt.type<"babybear"> + array.write %18[%19] = %17 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %18 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %pod_3[@count] = %21 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = function.call @OrArray_7::@OrArray_7::@compute(%23, %24) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %25 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %7 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %21 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = function.call @XorArray_2::@XorArray_2::@compute(%21, %22) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %12 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %13 = struct.readm %12[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %4 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %4 : !felt.type<"babybear"> + array.write %16[%17] = %15 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %16 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %pod_1[@count] = %19 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = function.call @XorArray_2::@XorArray_2::@compute(%21, %22) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %6 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %4 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_6 : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux0] = %0 : <@D_8::@D_8<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@D_8::@D_8<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux3$inputs] = %pod_2 : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@aux3] = %2 : <@D_8::@D_8<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@aux1] = %3 : <@D_8::@D_8<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@out] = %nondet : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@D_8::@D_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@D_8::@D_8<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@D_8::@D_8<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux3] : <@D_8::@D_8<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %4 = struct.readm %arg0[@aux3$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@D_8::@D_8<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %7 = struct.readm %arg0[@aux0] : <@D_8::@D_8<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + %8 = struct.readm %arg0[@aux0$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %8[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = struct.readm %7[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %15 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = struct.readm %1[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %23 = cast.toindex %15 : !felt.type<"babybear"> + %24 = array.read %22[%23] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg2[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = cast.toindex %15 : !felt.type<"babybear"> + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %15 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %0[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = pod.read %8[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_4::@ShR_4::@constrain(%7, %9) : (!struct.type<@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %10, %11) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %12 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%3, %12, %13) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_5::@ShL_5::@constrain(%1, %14) : (!struct.type<@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Theta_9 { + struct.def @Theta_9 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @r11 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r7 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d3 : !struct.type<@D_8::@D_8<[]>> + struct.member @d3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r8 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r22 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c3 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r5 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d1 : !struct.type<@D_8::@D_8<[]>> + struct.member @d1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r9 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r15 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r24 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c2 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r6 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d2 : !struct.type<@D_8::@D_8<[]>> + struct.member @d2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c4 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r2 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r23 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r19 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r20 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r13 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r17 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c1 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d4 : !struct.type<@D_8::@D_8<[]>> + struct.member @d4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r10 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d0 : !struct.type<@D_8::@D_8<[]>> + struct.member @d0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r18 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r0 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r1 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r3 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c0 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r21 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r12 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r16 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r4 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r14 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c320 = arith.constant {product_source = "compute"} 320 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_49 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_50 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_51 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_52 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_53 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_54 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_55 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_56 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_57 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_58 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_59 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_60 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_61 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_62 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_63 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_64 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_65 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_66 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_67 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_68 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %194 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %194[%195] = %193 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@a] = %194 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %197 = arith.subi %196, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %197 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.cmpi eq, %197, %c0 {product_source = "compute"} : index + scf.if %198 { + %231 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %199 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %200 = cast.toindex %199 : !felt.type<"babybear"> {product_source = "compute"} + %201 = array.read %arg0[%200] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %202 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %202[%203] = %201 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@b] = %202 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %205 = arith.subi %204, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %205 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.cmpi eq, %205, %c0 {product_source = "compute"} : index + scf.if %206 { + %231 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %207 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "compute"} + %209 = array.read %arg0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %210 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %210[%211] = %209 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@c] = %210 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %213 = arith.subi %212, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %213 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.cmpi eq, %213, %c0 {product_source = "compute"} : index + scf.if %214 { + %231 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %215 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "compute"} + %217 = array.read %arg0[%216] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %218 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %219 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %218[%219] = %217 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@d] = %218 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %221 = arith.subi %220, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %221 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.cmpi eq, %221, %c0 {product_source = "compute"} : index + scf.if %222 { + %231 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %223 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %224 = cast.toindex %223 : !felt.type<"babybear"> {product_source = "compute"} + %225 = array.read %arg0[%224] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %226 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %227 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %226[%227] = %225 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@e] = %226 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %229 = arith.subi %228, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %229 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.cmpi eq, %229, %c0 {product_source = "compute"} : index + scf.if %230 { + %231 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %194 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %194[%195] = %193 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@a] = %194 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %197 = arith.subi %196, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %197 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.cmpi eq, %197, %c0 {product_source = "compute"} : index + scf.if %198 { + %208 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %209 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = function.call @XorArray_2::@XorArray_2::@compute(%208, %209) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %210 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %199 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %200 = struct.readm %199[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %206 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %208 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %209 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = function.call @XorArray_2::@XorArray_2::@compute(%208, %209) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %210 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%196] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_46 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %0 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_2 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %1 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_8 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %2 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d2$inputs] = %pod_26 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d2] = %3 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_68 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %4 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_18 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %5 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_62 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %6 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_20 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %7 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_30 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %8 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_60 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %9 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_66 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %10 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_34 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %11 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_38 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %12 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_54 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %13 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_36 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %14 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d4$inputs] = %pod_44 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d4] = %15 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c3$inputs] = %pod_10 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3] = %16 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_64 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %17 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_16 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %18 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c1$inputs] = %pod_42 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c1] = %19 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_0 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %20 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_40 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %21 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_52 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %22 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_24 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %23 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d3$inputs] = %pod_4 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d3] = %24 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_12 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %25 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c0$inputs] = %pod_58 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c0] = %26 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_6 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %27 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c2$inputs] = %pod_22 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2] = %28 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@d0$inputs] = %pod_48 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0] = %29 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_50 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %30 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_32 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %31 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c4$inputs] = %pod_28 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c4] = %32 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@d1$inputs] = %pod_14 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d1] = %33 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_56 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %34 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %35 = struct.readm %self[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = struct.readm %self[@r11] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@r11$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = struct.readm %self[@r7] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@r7$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@d3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@d3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@r8] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@r8$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %44 = struct.readm %self[@r22] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@r22$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@c3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@c3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@r5] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@r5$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@d1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@d1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %52 = struct.readm %self[@r9] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %53 = struct.readm %self[@r9$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = struct.readm %self[@r15] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %55 = struct.readm %self[@r15$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %56 = struct.readm %self[@r24] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %57 = struct.readm %self[@r24$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = struct.readm %self[@c2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %59 = struct.readm %self[@c2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %60 = struct.readm %self[@r6] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %61 = struct.readm %self[@r6$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %62 = struct.readm %self[@d2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %63 = struct.readm %self[@d2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %64 = struct.readm %self[@c4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %65 = struct.readm %self[@c4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %66 = struct.readm %self[@r2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %67 = struct.readm %self[@r2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %68 = struct.readm %self[@r23] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %69 = struct.readm %self[@r23$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %70 = struct.readm %self[@r19] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %71 = struct.readm %self[@r19$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %72 = struct.readm %self[@r20] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %73 = struct.readm %self[@r20$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %74 = struct.readm %self[@r13] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %75 = struct.readm %self[@r13$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %76 = struct.readm %self[@r17] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %77 = struct.readm %self[@r17$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %78 = struct.readm %self[@c1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %79 = struct.readm %self[@c1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %80 = struct.readm %self[@d4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %81 = struct.readm %self[@d4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %82 = struct.readm %self[@r10] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %83 = struct.readm %self[@r10$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %84 = struct.readm %self[@d0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %85 = struct.readm %self[@d0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %86 = struct.readm %self[@r18] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %87 = struct.readm %self[@r18$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %88 = struct.readm %self[@r0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %89 = struct.readm %self[@r0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %90 = struct.readm %self[@r1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %91 = struct.readm %self[@r1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %92 = struct.readm %self[@r3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %93 = struct.readm %self[@r3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %94 = struct.readm %self[@c0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %95 = struct.readm %self[@c0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %96 = struct.readm %self[@r21] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %97 = struct.readm %self[@r21$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %98 = struct.readm %self[@r12] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %99 = struct.readm %self[@r12$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %100 = struct.readm %self[@r16] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %101 = struct.readm %self[@r16$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %102 = struct.readm %self[@r4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %103 = struct.readm %self[@r4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %104 = struct.readm %self[@r14] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %105 = struct.readm %self[@r14$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %194 = pod.read %95[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %193 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = cast.toindex %197 : !felt.type<"babybear"> {product_source = "constrain"} + %199 = array.read %arg0[%198] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %200 = pod.read %95[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %202, %199 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %203 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = cast.toindex %203 : !felt.type<"babybear"> {product_source = "constrain"} + %205 = array.read %arg0[%204] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %206 = pod.read %95[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %207 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %208 = array.read %206[%207] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %208, %205 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %209 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = cast.toindex %209 : !felt.type<"babybear"> {product_source = "constrain"} + %211 = array.read %arg0[%210] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %212 = pod.read %95[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %213 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %214 = array.read %212[%213] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %214, %211 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %215 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "constrain"} + %217 = array.read %arg0[%216] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %218 = pod.read %95[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %219 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %220 = array.read %218[%219] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %220, %217 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %79[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %79[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %79[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %79[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %79[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %59[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %59[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %47[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %47[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %65[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %65[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %78[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %85[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %64[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %85[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %194 = pod.read %89[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %193 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = struct.readm %84[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %198 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %199 = array.read %197[%198] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %200 = pod.read %89[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %202, %199 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %88[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %35[%195] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %84[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %48[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %83[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %84[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %83[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %82[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %84[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %54[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %84[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %72[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %58[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %94[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %91[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %50[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %91[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %90[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %50[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %60[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %50[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %101[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %50[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %101[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %100[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %97[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %50[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %97[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %96[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %46[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %78[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %66[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %38[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %99[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %99[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %98[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %77[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %77[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %76[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %62[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %44[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %64[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %58[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %93[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %40[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %93[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %92[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %40[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %42[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %40[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %74[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %87[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %40[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %87[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %86[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %40[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %68[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %94[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %81[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %46[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %81[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %103[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %80[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %103[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %102[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %80[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %52[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %105[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %80[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %105[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %104[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %80[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %70[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %80[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %56[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %106 = pod.read %83[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %83[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%82, %106, %107) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %108 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%38, %108, %109) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %110 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%44, %110, %111) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%62, %112, %113) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %114 = pod.read %105[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %105[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%104, %114, %115) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %116 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %117 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%54, %116, %117) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %118 = pod.read %99[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %99[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%98, %118, %119) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %120 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%56, %120, %121) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %122 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%66, %122, %123) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %124 = pod.read %97[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %97[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%96, %124, %125) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %126 = pod.read %103[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = pod.read %103[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%102, %126, %127) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %128 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%70, %128, %129) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %130 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%74, %130, %131) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %132 = pod.read %91[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = pod.read %91[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%90, %132, %133) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %134 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%72, %134, %135) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %81[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %81[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%80, %136, %137) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %138 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %47[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = pod.read %47[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%46, %138, %139, %140, %141, %142) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %143 = pod.read %101[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = pod.read %101[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%100, %143, %144) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %145 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%52, %145, %146) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %147 = pod.read %79[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %148 = pod.read %79[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %79[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %150 = pod.read %79[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = pod.read %79[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%78, %147, %148, %149, %150, %151) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %152 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%36, %152, %153) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %154 = pod.read %77[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = pod.read %77[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%76, %154, %155) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %156 = pod.read %89[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = pod.read %89[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%88, %156, %157) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %158 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %159 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%60, %158, %159) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %160 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%40, %160, %161) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %162 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%48, %162, %163) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %164 = pod.read %95[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %165 = pod.read %95[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = pod.read %95[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = pod.read %95[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = pod.read %95[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%94, %164, %165, %166, %167, %168) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %169 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %170 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%42, %169, %170) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %171 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %172 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %174 = pod.read %59[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = pod.read %59[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%58, %171, %172, %173, %174, %175) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %176 = pod.read %85[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %177 = pod.read %85[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%84, %176, %177) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %178 = pod.read %87[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = pod.read %87[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%86, %178, %179) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %180 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %181 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%68, %180, %181) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %182 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %183 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %184 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = pod.read %65[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %186 = pod.read %65[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%64, %182, %183, %184, %185, %186) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %187 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %188 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%50, %187, %188) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %189 = pod.read %93[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %190 = pod.read %93[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%92, %189, %190) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Theta_9::@Theta_9<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c320 = arith.constant {product_source = "compute"} 320 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_49 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_50 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_51 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_52 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_53 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_54 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_55 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_56 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_57 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_58 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_59 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_60 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_61 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_62 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_63 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_64 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_65 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_66 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_67 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_68 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg0[%36] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@a] = %38 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %41 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %75 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %43 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@b] = %46 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %49 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %75 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %51 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %arg0[%52] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %54 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %54[%55] = %53 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@c] = %54 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %57 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %75 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %59 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %arg0[%60] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %62[%63] = %61 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@d] = %62 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %65 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %75 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %67 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %arg0[%68] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %70 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %71 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %70[%71] = %69 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@e] = %70 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %73 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %75 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_58[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_58[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_58[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_42[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_42[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_28[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_28[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg0[%36] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@a] = %38 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %41 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %52 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @XorArray_2::@XorArray_2::@compute(%52, %53) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %54 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %43 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %44[%45] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %50 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @XorArray_2::@XorArray_2::@compute(%52, %53) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %54 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%40] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_46 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %0 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_2 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %1 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_8 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %2 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d2$inputs] = %pod_26 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d2] = %3 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_68 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %4 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_18 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %5 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_62 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %6 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_20 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %7 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_30 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %8 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_60 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %9 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_66 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %10 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_34 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %11 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_38 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %12 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_54 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %13 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_36 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %14 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d4$inputs] = %pod_44 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d4] = %15 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c3$inputs] = %pod_10 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3] = %16 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_64 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %17 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_16 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %18 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c1$inputs] = %pod_42 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c1] = %19 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_0 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %20 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_40 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %21 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_52 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %22 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_24 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %23 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d3$inputs] = %pod_4 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d3] = %24 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_12 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %25 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c0$inputs] = %pod_58 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c0] = %26 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_6 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %27 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c2$inputs] = %pod_22 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2] = %28 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@d0$inputs] = %pod_48 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0] = %29 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_50 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %30 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_32 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %31 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c4$inputs] = %pod_28 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c4] = %32 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@d1$inputs] = %pod_14 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d1] = %33 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_56 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %34 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Theta_9::@Theta_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Theta_9::@Theta_9<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@r11] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@r11$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@r7] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@r7$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@d3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@d3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@r8] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@r8$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@r22] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@r22$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@c3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@c3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@r5] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@r5$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@d1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@d1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@r9] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@r9$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@r15] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@r15$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@r24] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@r24$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@c2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@c2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@r6] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@r6$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@d2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@d2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@c4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@c4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@r2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@r2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@r23] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@r23$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@r19] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@r19$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@r20] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@r20$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@r13] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@r13$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@r17] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@r17$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@c1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@c1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@d4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@d4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@r10] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@r10$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %arg0[@d0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %50 = struct.readm %arg0[@d0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = struct.readm %arg0[@r18] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %52 = struct.readm %arg0[@r18$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %53 = struct.readm %arg0[@r0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %54 = struct.readm %arg0[@r0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = struct.readm %arg0[@r1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %56 = struct.readm %arg0[@r1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %57 = struct.readm %arg0[@r3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %58 = struct.readm %arg0[@r3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %59 = struct.readm %arg0[@c0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %60 = struct.readm %arg0[@c0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %61 = struct.readm %arg0[@r21] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %62 = struct.readm %arg0[@r21$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %63 = struct.readm %arg0[@r12] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %64 = struct.readm %arg0[@r12$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %65 = struct.readm %arg0[@r16] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %66 = struct.readm %arg0[@r16$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %67 = struct.readm %arg0[@r4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %68 = struct.readm %arg0[@r4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %69 = struct.readm %arg0[@r14] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %70 = struct.readm %arg0[@r14$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %arg1[%157] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %159[%160] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = cast.toindex %162 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %arg1[%163] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %165[%166] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %arg1[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = pod.read %60[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %172 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %171[%172] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = cast.toindex %174 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %arg1[%175] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = pod.read %60[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %178 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %177[%178] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = cast.toindex %180 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %arg1[%181] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = pod.read %60[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %184 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %183[%184] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %44[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %44[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %24[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %24[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %12[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %12[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %30[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %30[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %43[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %29[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %arg1[%157] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %159[%160] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %49[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %165[%166] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %53[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %49[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %13[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %49[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %47[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %49[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %19[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %49[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %37[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %23[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %59[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %15[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %55[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %15[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %25[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %15[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %15[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %65[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %15[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %61[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %11[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %43[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %31[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %63[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %41[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %27[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %9[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %29[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %23[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %5[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %57[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %5[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %7[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %5[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %39[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %5[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %51[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %5[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %33[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %59[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %11[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %45[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %67[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %45[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %17[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %45[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %70[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %69[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %45[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %35[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %45[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %21[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %71 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %72 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%47, %71, %72) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %73 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%3, %73, %74) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%9, %75, %76) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %77 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%27, %77, %78) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %79 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %70[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%69, %79, %80) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %81 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%19, %81, %82) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %83 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = pod.read %64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%63, %83, %84) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %85 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%21, %85, %86) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %87 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%31, %87, %88) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %89 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = pod.read %62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%61, %89, %90) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %91 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%67, %91, %92) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %94 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%35, %93, %94) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %95 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %96 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%39, %95, %96) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %97 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%55, %97, %98) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %99 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %100 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%37, %99, %100) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %101 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%45, %101, %102) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %103 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %105 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %106 = pod.read %12[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %12[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%11, %103, %104, %105, %106, %107) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %108 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%65, %108, %109) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %110 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%17, %110, %111) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %114 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %44[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %44[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%43, %112, %113, %114, %115, %116) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %117 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %118 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%1, %117, %118) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %119 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%41, %119, %120) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %121 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%53, %121, %122) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %123 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%25, %123, %124) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %125 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %126 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%5, %125, %126) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %127 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%13, %127, %128) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %129 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %130 = pod.read %60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %60[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = pod.read %60[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = pod.read %60[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%59, %129, %130, %131, %132, %133) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %134 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%7, %134, %135) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = pod.read %24[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %24[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%23, %136, %137, %138, %139, %140) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %141 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%49, %141, %142) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %143 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = pod.read %52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%51, %143, %144) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %145 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%33, %145, %146) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %147 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %148 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %150 = pod.read %30[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = pod.read %30[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%29, %147, %148, %149, %150, %151) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %152 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%15, %152, %153) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %154 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = pod.read %58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%57, %154, %155) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @stepRhoPi_10 { + struct.def @stepRhoPi_10 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_4::@ShR_4<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_5::@ShL_5<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_10::@stepRhoPi_10<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_4::@ShR_4::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_5::@ShL_5::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + %5 = struct.readm %4[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + %14 = struct.readm %13[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_4::@ShR_4::@constrain(%3, %9) : (!struct.type<@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_5::@ShL_5::@constrain(%5, %10) : (!struct.type<@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_11 { + struct.def @ShR_11 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_11::@ShR_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_11::@ShR_11<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_11::@ShR_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_11::@ShR_11<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_12 { + struct.def @ShL_12 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_12::@ShL_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %self = struct.new : <@ShL_12::@ShL_12<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_12::@ShL_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_12::@ShL_12<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_13 { + struct.def @stepRhoPi_13 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_11::@ShR_11<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_12::@ShL_12<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_13::@stepRhoPi_13<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_11::@ShR_11::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_11::@ShR_11<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_12::@ShL_12::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_12::@ShL_12<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + %5 = struct.readm %4[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + %14 = struct.readm %13[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShL_12::@ShL_12<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShR_11::@ShR_11<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShR_11::@ShR_11<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShL_12::@ShL_12<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_12::@ShL_12::@constrain(%3, %7) : (!struct.type<@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_11::@ShR_11::@constrain(%1, %10) : (!struct.type<@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_14 { + struct.def @ShR_14 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_14::@ShR_14<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_14::@ShR_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_14::@ShR_14<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_58 = felt.const 58 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_15 { + struct.def @ShL_15 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %self = struct.new : <@ShL_15::@ShL_15<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_6 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_15::@ShL_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_15::@ShL_15<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_6 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_16 { + struct.def @stepRhoPi_16 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_14::@ShR_14<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_15::@ShL_15<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_16::@stepRhoPi_16<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_14::@ShR_14::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_15::@ShL_15::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> + %5 = struct.readm %4[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> + %14 = struct.readm %13[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_14::@ShR_14::@constrain(%1, %7) : (!struct.type<@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_15::@ShL_15::@constrain(%5, %10) : (!struct.type<@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_17 { + struct.def @ShR_17 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_17::@ShR_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_17::@ShR_17<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_17::@ShR_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_17::@ShR_17<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_18 { + struct.def @ShL_18 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_18::@ShL_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %self = struct.new : <@ShL_18::@ShL_18<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_10 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_18::@ShL_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_18::@ShL_18<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_10 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_19 { + struct.def @stepRhoPi_19 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_18::@ShL_18<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_17::@ShR_17<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_19::@stepRhoPi_19<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_17::@ShR_17::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_17::@ShR_17<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_18::@ShL_18::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_18::@ShL_18<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + %5 = struct.readm %4[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + %14 = struct.readm %13[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShL_18::@ShL_18<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShR_17::@ShR_17<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShL_18::@ShL_18<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShR_17::@ShR_17<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_18::@ShL_18::@constrain(%1, %9) : (!struct.type<@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_17::@ShR_17::@constrain(%5, %10) : (!struct.type<@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_20 { + struct.def @ShR_20 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_20::@ShR_20<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_20::@ShR_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_20::@ShR_20<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_49 = felt.const 49 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_21 { + struct.def @ShL_21 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %self = struct.new : <@ShL_21::@ShL_21<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_15) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_15 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_21::@ShL_21<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_21::@ShL_21<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_15) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_15 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_22 { + struct.def @stepRhoPi_22 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_21::@ShL_21<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_20::@ShR_20<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_22::@stepRhoPi_22<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_20::@ShR_20::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_21::@ShL_21::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> + %5 = struct.readm %4[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> + %14 = struct.readm %13[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_20::@ShR_20::@constrain(%5, %7) : (!struct.type<@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_21::@ShL_21::@constrain(%1, %10) : (!struct.type<@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_23 { + struct.def @ShR_23 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_23::@ShR_23<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_23::@ShR_23<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_23::@ShR_23<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_23::@ShR_23<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_24 { + struct.def @ShL_24 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_24::@ShL_24<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %self = struct.new : <@ShL_24::@ShL_24<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_21) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_24::@ShL_24<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_24::@ShL_24<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_21) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_25 { + struct.def @stepRhoPi_25 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_23::@ShR_23<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_24::@ShL_24<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_25::@stepRhoPi_25<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_23::@ShR_23::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_23::@ShR_23<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_24::@ShL_24::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_24::@ShL_24<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + %5 = struct.readm %4[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + %14 = struct.readm %13[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShL_24::@ShL_24<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShR_23::@ShR_23<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShR_23::@ShR_23<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShL_24::@ShL_24<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_24::@ShL_24::@constrain(%3, %7) : (!struct.type<@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_23::@ShR_23::@constrain(%1, %10) : (!struct.type<@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_26 { + struct.def @ShR_26 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_26::@ShR_26<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_26::@ShR_26<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_26::@ShR_26<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_27 { + struct.def @ShL_27 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %self = struct.new : <@ShL_27::@ShL_27<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_28) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_27::@ShL_27<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_27::@ShL_27<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_28) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_28 { + struct.def @stepRhoPi_28 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_26::@ShR_26<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_27::@ShL_27<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_28::@stepRhoPi_28<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_26::@ShR_26::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_27::@ShL_27::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> + %5 = struct.readm %4[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> + %14 = struct.readm %13[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_27::@ShL_27::@constrain(%3, %7) : (!struct.type<@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_26::@ShR_26::@constrain(%1, %8) : (!struct.type<@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_29 { + struct.def @ShR_29 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_29::@ShR_29<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_29::@ShR_29<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_29::@ShR_29<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_29::@ShR_29<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_30 { + struct.def @ShL_30 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_30::@ShL_30<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %self = struct.new : <@ShL_30::@ShL_30<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_36) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_30::@ShL_30<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_30::@ShL_30<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_36) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_31 { + struct.def @stepRhoPi_31 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_29::@ShR_29<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_30::@ShL_30<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_31::@stepRhoPi_31<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_29::@ShR_29::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_29::@ShR_29<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_30::@ShL_30::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_30::@ShL_30<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + %5 = struct.readm %4[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + %14 = struct.readm %13[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShR_29::@ShR_29<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShL_30::@ShL_30<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShR_29::@ShR_29<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShL_30::@ShL_30<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_29::@ShR_29::@constrain(%3, %7) : (!struct.type<@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_30::@ShL_30::@constrain(%5, %10) : (!struct.type<@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_32 { + struct.def @ShR_32 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_32::@ShR_32<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_32::@ShR_32<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_32::@ShR_32<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_19 = felt.const 19 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_33 { + struct.def @ShL_33 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %self = struct.new : <@ShL_33::@ShL_33<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_45) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_45 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_33::@ShL_33<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_33::@ShL_33<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_45) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_45 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_34 { + struct.def @stepRhoPi_34 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_32::@ShR_32<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_33::@ShL_33<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_34::@stepRhoPi_34<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_32::@ShR_32::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_33::@ShL_33::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> + %5 = struct.readm %4[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> + %14 = struct.readm %13[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_33::@ShL_33::@constrain(%3, %9) : (!struct.type<@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_32::@ShR_32::@constrain(%1, %10) : (!struct.type<@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_35 { + struct.def @ShR_35 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_35::@ShR_35<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_35::@ShR_35<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_35::@ShR_35<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_35::@ShR_35<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_36 { + struct.def @ShL_36 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_36::@ShL_36<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %self = struct.new : <@ShL_36::@ShL_36<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_55) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_55 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_36::@ShL_36<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_36::@ShL_36<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_55) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_55 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_37 { + struct.def @stepRhoPi_37 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_35::@ShR_35<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_36::@ShL_36<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_37::@stepRhoPi_37<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_35::@ShR_35::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_35::@ShR_35<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_36::@ShL_36::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_36::@ShL_36<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + %5 = struct.readm %4[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + %14 = struct.readm %13[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShL_36::@ShL_36<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShR_35::@ShR_35<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShR_35::@ShR_35<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShL_36::@ShL_36<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_36::@ShL_36::@constrain(%5, %9) : (!struct.type<@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_35::@ShR_35::@constrain(%3, %10) : (!struct.type<@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_38 { + struct.def @ShR_38 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_38::@ShR_38<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_38::@ShR_38<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_38::@ShR_38<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_39 { + struct.def @ShL_39 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@ShL_39::@ShL_39<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_39::@ShL_39<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_39::@ShL_39<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_40 { + struct.def @stepRhoPi_40 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_38::@ShR_38<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_39::@ShL_39<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_40::@stepRhoPi_40<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_38::@ShR_38::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_39::@ShL_39::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> + %5 = struct.readm %4[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> + %14 = struct.readm %13[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_38::@ShR_38::@constrain(%3, %7) : (!struct.type<@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_39::@ShL_39::@constrain(%5, %10) : (!struct.type<@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_41 { + struct.def @ShR_41 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_41::@ShR_41<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_41::@ShR_41<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_41::@ShR_41<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_41::@ShR_41<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_42 { + struct.def @ShL_42 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_42::@ShL_42<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %self = struct.new : <@ShL_42::@ShL_42<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_14) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_14 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_42::@ShL_42<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_42::@ShL_42<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_14) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_14 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_43 { + struct.def @stepRhoPi_43 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_42::@ShL_42<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_41::@ShR_41<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_43::@stepRhoPi_43<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_41::@ShR_41::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_41::@ShR_41<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_42::@ShL_42::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_42::@ShL_42<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + %5 = struct.readm %4[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + %14 = struct.readm %13[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShL_42::@ShL_42<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShR_41::@ShR_41<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShL_42::@ShL_42<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShR_41::@ShR_41<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_42::@ShL_42::@constrain(%3, %7) : (!struct.type<@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_41::@ShR_41::@constrain(%5, %8) : (!struct.type<@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_44 { + struct.def @ShR_44 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_44::@ShR_44<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_44::@ShR_44<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_44::@ShR_44<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_37 = felt.const 37 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_45 { + struct.def @ShL_45 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %self = struct.new : <@ShL_45::@ShL_45<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_27) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_27 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_45::@ShL_45<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_45::@ShL_45<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_27) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_27 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_46 { + struct.def @stepRhoPi_46 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_45::@ShL_45<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_44::@ShR_44<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_46::@stepRhoPi_46<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_44::@ShR_44::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_45::@ShL_45::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> + %5 = struct.readm %4[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> + %14 = struct.readm %13[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_44::@ShR_44::@constrain(%3, %9) : (!struct.type<@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_45::@ShL_45::@constrain(%1, %10) : (!struct.type<@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_47 { + struct.def @ShR_47 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_47::@ShR_47<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_47::@ShR_47<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_47::@ShR_47<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_47::@ShR_47<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_48 { + struct.def @ShL_48 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_48::@ShL_48<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %self = struct.new : <@ShL_48::@ShL_48<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_41) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_41 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_48::@ShL_48<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_48::@ShL_48<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_41) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_41 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_49 { + struct.def @stepRhoPi_49 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_48::@ShL_48<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_47::@ShR_47<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_49::@stepRhoPi_49<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_47::@ShR_47::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_47::@ShR_47<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_48::@ShL_48::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_48::@ShL_48<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + %5 = struct.readm %4[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + %14 = struct.readm %13[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShR_47::@ShR_47<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShL_48::@ShL_48<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShL_48::@ShL_48<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShR_47::@ShR_47<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_47::@ShR_47::@constrain(%5, %7) : (!struct.type<@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_48::@ShL_48::@constrain(%1, %10) : (!struct.type<@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_50 { + struct.def @ShR_50 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_50::@ShR_50<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_50::@ShR_50<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_50::@ShR_50<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_51 { + struct.def @ShL_51 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %self = struct.new : <@ShL_51::@ShL_51<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_56) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_51::@ShL_51<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_51::@ShL_51<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_56) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_52 { + struct.def @stepRhoPi_52 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_51::@ShL_51<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_50::@ShR_50<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_52::@stepRhoPi_52<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_50::@ShR_50::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_51::@ShL_51::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> + %5 = struct.readm %4[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> + %14 = struct.readm %13[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_50::@ShR_50::@constrain(%3, %7) : (!struct.type<@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_51::@ShL_51::@constrain(%1, %10) : (!struct.type<@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_53 { + struct.def @ShR_53 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_53::@ShR_53<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_53::@ShR_53<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_53::@ShR_53<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_53::@ShR_53<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_54 { + struct.def @ShL_54 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_54::@ShL_54<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %self = struct.new : <@ShL_54::@ShL_54<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_54::@ShL_54<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_54::@ShL_54<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_55 { + struct.def @stepRhoPi_55 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_54::@ShL_54<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_53::@ShR_53<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_55::@stepRhoPi_55<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_53::@ShR_53::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_53::@ShR_53<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_54::@ShL_54::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_54::@ShL_54<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + %5 = struct.readm %4[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + %14 = struct.readm %13[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShR_53::@ShR_53<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShL_54::@ShL_54<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShL_54::@ShL_54<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShR_53::@ShR_53<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_53::@ShR_53::@constrain(%5, %7) : (!struct.type<@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_54::@ShL_54::@constrain(%1, %10) : (!struct.type<@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_56 { + struct.def @ShR_56 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_56::@ShR_56<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_56::@ShR_56<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_56::@ShR_56<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_57 { + struct.def @ShL_57 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %self = struct.new : <@ShL_57::@ShL_57<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_25) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_57::@ShL_57<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_57::@ShL_57<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_25) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_58 { + struct.def @stepRhoPi_58 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_56::@ShR_56<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_57::@ShL_57<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_58::@stepRhoPi_58<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_56::@ShR_56::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_57::@ShL_57::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> + %5 = struct.readm %4[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> + %14 = struct.readm %13[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_56::@ShR_56::@constrain(%1, %7) : (!struct.type<@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_57::@ShL_57::@constrain(%5, %10) : (!struct.type<@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_59 { + struct.def @ShR_59 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_59::@ShR_59<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_59::@ShR_59<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_59::@ShR_59<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_59::@ShR_59<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_60 { + struct.def @ShL_60 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_60::@ShL_60<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %self = struct.new : <@ShL_60::@ShL_60<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_43) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_60::@ShL_60<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_60::@ShL_60<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_43) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_61 { + struct.def @stepRhoPi_61 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_59::@ShR_59<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_60::@ShL_60<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_61::@stepRhoPi_61<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_59::@ShR_59::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_59::@ShR_59<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_60::@ShL_60::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_60::@ShL_60<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + %5 = struct.readm %4[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + %14 = struct.readm %13[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShL_60::@ShL_60<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShR_59::@ShR_59<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShR_59::@ShR_59<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShL_60::@ShL_60<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_60::@ShL_60::@constrain(%5, %9) : (!struct.type<@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_59::@ShR_59::@constrain(%1, %10) : (!struct.type<@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_62 { + struct.def @ShR_62 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_62::@ShR_62<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_62::@ShR_62<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_62::@ShR_62<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_63 { + struct.def @ShL_63 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %self = struct.new : <@ShL_63::@ShL_63<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_62) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_63::@ShL_63<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_63::@ShL_63<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_62) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_64 { + struct.def @stepRhoPi_64 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_62::@ShR_62<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_63::@ShL_63<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_64::@stepRhoPi_64<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_62::@ShR_62::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_63::@ShL_63::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> + %5 = struct.readm %4[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> + %14 = struct.readm %13[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_63::@ShL_63::@constrain(%5, %7) : (!struct.type<@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_62::@ShR_62::@constrain(%3, %8) : (!struct.type<@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_65 { + struct.def @ShR_65 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_65::@ShR_65<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_65::@ShR_65<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_65::@ShR_65<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_65::@ShR_65<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_66 { + struct.def @ShL_66 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_66::@ShL_66<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %self = struct.new : <@ShL_66::@ShL_66<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_18 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_66::@ShL_66<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_66::@ShL_66<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_18 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_67 { + struct.def @stepRhoPi_67 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_66::@ShL_66<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_65::@ShR_65<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_67::@stepRhoPi_67<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_65::@ShR_65::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_65::@ShR_65<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_66::@ShL_66::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_66::@ShL_66<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + %5 = struct.readm %4[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + %14 = struct.readm %13[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShR_65::@ShR_65<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShL_66::@ShL_66<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShL_66::@ShL_66<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShR_65::@ShR_65<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_65::@ShR_65::@constrain(%5, %9) : (!struct.type<@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_66::@ShL_66::@constrain(%1, %10) : (!struct.type<@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_68 { + struct.def @ShR_68 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_68::@ShR_68<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_68::@ShR_68<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_68::@ShR_68<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_69 { + struct.def @ShL_69 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %self = struct.new : <@ShL_69::@ShL_69<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_39) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_69::@ShL_69<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_69::@ShL_69<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_39) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_70 { + struct.def @stepRhoPi_70 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_68::@ShR_68<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_69::@ShL_69<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_70::@stepRhoPi_70<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_68::@ShR_68::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_69::@ShL_69::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> + %5 = struct.readm %4[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> + %14 = struct.readm %13[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_69::@ShL_69::@constrain(%5, %7) : (!struct.type<@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_68::@ShR_68::@constrain(%3, %10) : (!struct.type<@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_71 { + struct.def @ShR_71 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_71::@ShR_71<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_71::@ShR_71<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_71::@ShR_71<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_72 { + struct.def @ShL_72 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %self = struct.new : <@ShL_72::@ShL_72<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_61) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_72::@ShL_72<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_72::@ShL_72<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_61) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_73 { + struct.def @stepRhoPi_73 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_71::@ShR_71<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_72::@ShL_72<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_73::@stepRhoPi_73<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_71::@ShR_71::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_72::@ShL_72::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> + %5 = struct.readm %4[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> + %14 = struct.readm %13[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_71::@ShR_71::@constrain(%1, %7) : (!struct.type<@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %8, %9) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_72::@ShL_72::@constrain(%3, %10) : (!struct.type<@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_74 { + struct.def @ShR_74 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_74::@ShR_74<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_74::@ShR_74<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_74::@ShR_74<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_74::@ShR_74<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_75 { + struct.def @ShL_75 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_75::@ShL_75<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %self = struct.new : <@ShL_75::@ShL_75<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_20) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_75::@ShL_75<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_75::@ShL_75<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_20) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_76 { + struct.def @stepRhoPi_76 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_74::@ShR_74<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_75::@ShL_75<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_76::@stepRhoPi_76<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_74::@ShR_74::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_74::@ShR_74<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_74::@ShR_74<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_75::@ShL_75::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_75::@ShL_75<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_75::@ShL_75<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_74::@ShR_74<[]>> + %5 = struct.readm %4[@out] : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_75::@ShL_75<[]>> + %14 = struct.readm %13[@out] : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_75::@ShL_75<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_75::@ShL_75<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShL_75::@ShL_75<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_74::@ShR_74<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_74::@ShR_74<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShR_74::@ShR_74<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShR_74::@ShR_74<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@ShL_75::@ShL_75<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_75::@ShL_75::@constrain(%3, %7) : (!struct.type<@ShL_75::@ShL_75<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_74::@ShR_74::@constrain(%1, %8) : (!struct.type<@ShR_74::@ShR_74<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%5, %9, %10) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_77 { + struct.def @ShR_77 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_77::@ShR_77<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_77::@ShR_77<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_77::@ShR_77<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_77::@ShR_77<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_78 { + struct.def @ShL_78 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_78::@ShL_78<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %self = struct.new : <@ShL_78::@ShL_78<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_44) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_78::@ShL_78<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_78::@ShL_78<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_44) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_79 { + struct.def @stepRhoPi_79 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_77::@ShR_77<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_78::@ShL_78<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_79::@stepRhoPi_79<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_77::@ShR_77::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_77::@ShR_77<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_77::@ShR_77<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_78::@ShL_78::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_78::@ShL_78<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_78::@ShL_78<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_77::@ShR_77<[]>> + %5 = struct.readm %4[@out] : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_78::@ShL_78<[]>> + %14 = struct.readm %13[@out] : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_7::@OrArray_7::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %5 = struct.readm %4[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_78::@ShL_78<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_78::@ShL_78<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShL_78::@ShL_78<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_77::@ShR_77<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_77::@ShR_77<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShR_77::@ShR_77<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShR_77::@ShR_77<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !struct.type<@ShL_78::@ShL_78<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%3, %7, %8) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_78::@ShL_78::@constrain(%5, %9) : (!struct.type<@ShL_78::@ShL_78<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_77::@ShR_77::@constrain(%1, %10) : (!struct.type<@ShR_77::@ShR_77<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @RhoPi_80 { + struct.def @RhoPi_80 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @s2 : !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.member @s2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s9 : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.member @s9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s12 : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.member @s12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s14 : !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.member @s14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s13 : !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.member @s13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s19 : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.member @s19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s1 : !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + struct.member @s1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s23 : !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.member @s23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s8 : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.member @s8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s21 : !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.member @s21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s4 : !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.member @s4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s6 : !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + struct.member @s6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s15 : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.member @s15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s24 : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.member @s24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s16 : !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.member @s16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s20 : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.member @s20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s3 : !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.member @s3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s17 : !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.member @s17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s18 : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.member @s18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s10 : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.member @s10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s7 : !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.member @s7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s11 : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.member @s11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s5 : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.member @s5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s22 : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.member @s22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_80::@RhoPi_80<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_384 = felt.const 384 : <"babybear"> + %felt_const_576 = felt.const 576 : <"babybear"> + %felt_const_1408 = felt.const 1408 : <"babybear"> + %felt_const_896 = felt.const 896 : <"babybear"> + %felt_const_1280 = felt.const 1280 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_768 = felt.const 768 : <"babybear"> + %felt_const_832 = felt.const 832 : <"babybear"> + %felt_const_1216 = felt.const 1216 : <"babybear"> + %felt_const_1472 = felt.const 1472 : <"babybear"> + %felt_const_960 = felt.const 960 : <"babybear"> + %felt_const_256 = felt.const 256 : <"babybear"> + %felt_const_1536 = felt.const 1536 : <"babybear"> + %felt_const_1344 = felt.const 1344 : <"babybear"> + %felt_const_512 = felt.const 512 : <"babybear"> + %felt_const_1024 = felt.const 1024 : <"babybear"> + %felt_const_320 = felt.const 320 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_1152 = felt.const 1152 : <"babybear"> + %felt_const_1088 = felt.const 1088 : <"babybear"> + %felt_const_704 = felt.const 704 : <"babybear"> + %felt_const_448 = felt.const 448 : <"babybear"> + %felt_const_640 = felt.const 640 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> + %c64 = arith.constant 64 : index + %self = struct.new : <@RhoPi_80::@RhoPi_80<[]>> + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]> + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_7 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]> + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_9 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]> + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_11 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]> + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_13 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]> + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_15 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]> + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_17 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]> + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_19 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]> + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_21 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]> + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_23 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]> + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_25 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]> + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_27 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]> + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_29 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]> + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_31 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]> + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_33 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]> + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_35 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]> + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_37 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]> + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_39 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]> + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_41 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]> + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_43 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]> + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_45 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]> + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_38[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_37[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_10::@stepRhoPi_10::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + pod.write %pod_37[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_40[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_39[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_13::@stepRhoPi_13::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + pod.write %pod_39[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_42[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_41[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_16::@stepRhoPi_16::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + pod.write %pod_41[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_34[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_33[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_19::@stepRhoPi_19::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + pod.write %pod_33[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_36[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_35[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_22::@stepRhoPi_22::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + pod.write %pod_35[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_32[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_31[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_25::@stepRhoPi_25::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + pod.write %pod_31[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_44[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_43[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_28::@stepRhoPi_28::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + pod.write %pod_43[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_28[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_27[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_31::@stepRhoPi_31::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + pod.write %pod_27[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_16[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_15[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_34::@stepRhoPi_34::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + pod.write %pod_15[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_18[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_17[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_37::@stepRhoPi_37::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + pod.write %pod_17[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_26[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_25[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_40::@stepRhoPi_40::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + pod.write %pod_25[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_20[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_19[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_43::@stepRhoPi_43::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + pod.write %pod_19[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_24[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_23[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_46::@stepRhoPi_46::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + pod.write %pod_23[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_14[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_13[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_49::@stepRhoPi_49::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + pod.write %pod_13[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_10[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_9[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_52::@stepRhoPi_52::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + pod.write %pod_9[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_8[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_7[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_55::@stepRhoPi_55::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + pod.write %pod_7[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_58::@stepRhoPi_58::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + pod.write %pod_3[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_61::@stepRhoPi_61::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_30[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_29[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_64::@stepRhoPi_64::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + pod.write %pod_29[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_6[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_5[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_67::@stepRhoPi_67::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + pod.write %pod_5[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_46[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_45[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_70::@stepRhoPi_70::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + pod.write %pod_45[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_73::@stepRhoPi_73::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + pod.write %pod_1[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_22[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_21[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_76::@stepRhoPi_76::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + pod.write %pod_21[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = felt.add %24, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %29 = cast.toindex %24 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_12[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %30 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod_11[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %34 = function.call @stepRhoPi_79::@stepRhoPi_79::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + pod.write %pod_11[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %25 = cast.toindex %24 : !felt.type<"babybear"> + %26 = array.read %arg0[%25] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = cast.toindex %24 : !felt.type<"babybear"> + array.write %nondet[%27] = %26 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + %29 = struct.readm %28[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + %30 = cast.toindex %24 : !felt.type<"babybear"> + %31 = array.read %29[%30] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %24, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %32 : !felt.type<"babybear"> + array.write %nondet[%33] = %31 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + %35 = struct.readm %34[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %36 = cast.toindex %24 : !felt.type<"babybear"> + %37 = array.read %35[%36] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %24, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = cast.toindex %38 : !felt.type<"babybear"> + array.write %nondet[%39] = %37 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + %41 = struct.readm %40[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + %42 = cast.toindex %24 : !felt.type<"babybear"> + %43 = array.read %41[%42] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.add %24, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = cast.toindex %44 : !felt.type<"babybear"> + array.write %nondet[%45] = %43 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + %47 = struct.readm %46[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %48 = cast.toindex %24 : !felt.type<"babybear"> + %49 = array.read %47[%48] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %50 = felt.add %24, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = cast.toindex %50 : !felt.type<"babybear"> + array.write %nondet[%51] = %49 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + %53 = struct.readm %52[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + %54 = cast.toindex %24 : !felt.type<"babybear"> + %55 = array.read %53[%54] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %56 = felt.add %24, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = cast.toindex %56 : !felt.type<"babybear"> + array.write %nondet[%57] = %55 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + %59 = struct.readm %58[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %60 = cast.toindex %24 : !felt.type<"babybear"> + %61 = array.read %59[%60] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %62 = felt.add %24, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = cast.toindex %62 : !felt.type<"babybear"> + array.write %nondet[%63] = %61 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %64 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + %65 = struct.readm %64[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + %66 = cast.toindex %24 : !felt.type<"babybear"> + %67 = array.read %65[%66] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %68 = felt.add %24, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %68 : !felt.type<"babybear"> + array.write %nondet[%69] = %67 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + %71 = struct.readm %70[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %72 = cast.toindex %24 : !felt.type<"babybear"> + %73 = array.read %71[%72] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %74 = felt.add %24, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + array.write %nondet[%75] = %73 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + %77 = struct.readm %76[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %24 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %80 = felt.add %24, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %81 = cast.toindex %80 : !felt.type<"babybear"> + array.write %nondet[%81] = %79 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %82 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + %83 = struct.readm %82[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %84 = cast.toindex %24 : !felt.type<"babybear"> + %85 = array.read %83[%84] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %86 = felt.add %24, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %87 = cast.toindex %86 : !felt.type<"babybear"> + array.write %nondet[%87] = %85 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %88 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + %89 = struct.readm %88[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + %90 = cast.toindex %24 : !felt.type<"babybear"> + %91 = array.read %89[%90] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = felt.add %24, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %93 = cast.toindex %92 : !felt.type<"babybear"> + array.write %nondet[%93] = %91 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %94 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + %95 = struct.readm %94[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %96 = cast.toindex %24 : !felt.type<"babybear"> + %97 = array.read %95[%96] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %98 = felt.add %24, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %99 = cast.toindex %98 : !felt.type<"babybear"> + array.write %nondet[%99] = %97 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %100 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + %101 = struct.readm %100[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + %102 = cast.toindex %24 : !felt.type<"babybear"> + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %104 = felt.add %24, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %105 = cast.toindex %104 : !felt.type<"babybear"> + array.write %nondet[%105] = %103 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %106 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + %107 = struct.readm %106[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %108 = cast.toindex %24 : !felt.type<"babybear"> + %109 = array.read %107[%108] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %110 = felt.add %24, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %111 = cast.toindex %110 : !felt.type<"babybear"> + array.write %nondet[%111] = %109 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %112 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + %113 = struct.readm %112[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + %114 = cast.toindex %24 : !felt.type<"babybear"> + %115 = array.read %113[%114] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %116 = felt.add %24, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %117 = cast.toindex %116 : !felt.type<"babybear"> + array.write %nondet[%117] = %115 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %118 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + %119 = struct.readm %118[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %120 = cast.toindex %24 : !felt.type<"babybear"> + %121 = array.read %119[%120] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %122 = felt.add %24, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %123 = cast.toindex %122 : !felt.type<"babybear"> + array.write %nondet[%123] = %121 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %124 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + %125 = struct.readm %124[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + %126 = cast.toindex %24 : !felt.type<"babybear"> + %127 = array.read %125[%126] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %128 = felt.add %24, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %129 = cast.toindex %128 : !felt.type<"babybear"> + array.write %nondet[%129] = %127 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %130 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + %131 = struct.readm %130[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %132 = cast.toindex %24 : !felt.type<"babybear"> + %133 = array.read %131[%132] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %134 = felt.add %24, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %135 = cast.toindex %134 : !felt.type<"babybear"> + array.write %nondet[%135] = %133 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %136 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + %137 = struct.readm %136[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + %138 = cast.toindex %24 : !felt.type<"babybear"> + %139 = array.read %137[%138] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %140 = felt.add %24, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %141 = cast.toindex %140 : !felt.type<"babybear"> + array.write %nondet[%141] = %139 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %142 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + %143 = struct.readm %142[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %144 = cast.toindex %24 : !felt.type<"babybear"> + %145 = array.read %143[%144] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %146 = felt.add %24, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %147 = cast.toindex %146 : !felt.type<"babybear"> + array.write %nondet[%147] = %145 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %148 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + %149 = struct.readm %148[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + %150 = cast.toindex %24 : !felt.type<"babybear"> + %151 = array.read %149[%150] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %152 = felt.add %24, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %153 = cast.toindex %152 : !felt.type<"babybear"> + array.write %nondet[%153] = %151 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %154 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + %155 = struct.readm %154[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + %156 = cast.toindex %24 : !felt.type<"babybear"> + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %158 = felt.add %24, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %159 = cast.toindex %158 : !felt.type<"babybear"> + array.write %nondet[%159] = %157 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %160 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + %161 = struct.readm %160[@out] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + %162 = cast.toindex %24 : !felt.type<"babybear"> + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %164 = felt.add %24, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %165 = cast.toindex %164 : !felt.type<"babybear"> + array.write %nondet[%165] = %163 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %166 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + %167 = struct.readm %166[@out] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + %168 = cast.toindex %24 : !felt.type<"babybear"> + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %170 = felt.add %24, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %171 = cast.toindex %170 : !felt.type<"babybear"> + array.write %nondet[%171] = %169 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@s18$inputs] = %pod_36 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.writem %self[@s18] = %0 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.writem %self[@s16$inputs] = %pod_28 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.writem %self[@s16] = %1 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.writem %self[@s23$inputs] = %pod_14 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.writem %self[@s23] = %2 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.writem %self[@s3$inputs] = %pod_32 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %3 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.writem %self[@s3] = %3 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.writem %self[@s4$inputs] = %pod_20 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %4 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.writem %self[@s4] = %4 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.writem %self[@s15$inputs] = %pod_24 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %5 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.writem %self[@s15] = %5 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.writem %self[@s10$inputs] = %pod_38 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %6 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.writem %self[@s10] = %6 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.writem %self[@s24$inputs] = %pod_26 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %7 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.writem %self[@s24] = %7 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.writem %self[@s19$inputs] = %pod_10 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %8 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.writem %self[@s19] = %8 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.writem %self[@s2$inputs] = %pod_0 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.writem %self[@s2] = %9 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.writem %self[@s8$inputs] = %pod_16 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %10 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.writem %self[@s8] = %10 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.writem %self[@s21$inputs] = %pod_18 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %11 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.writem %self[@s21] = %11 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.writem %self[@s17$inputs] = %pod_34 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %12 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.writem %self[@s17] = %12 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.writem %self[@s14$inputs] = %pod_6 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %13 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.writem %self[@s14] = %13 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.writem %self[@s6$inputs] = %pod_22 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %14 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + struct.writem %self[@s6] = %14 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + struct.writem %self[@s7$inputs] = %pod_40 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %15 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.writem %self[@s7] = %15 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.writem %self[@s20$inputs] = %pod_30 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %16 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.writem %self[@s20] = %16 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.writem %self[@s11$inputs] = %pod_42 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %17 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.writem %self[@s11] = %17 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.writem %self[@s13$inputs] = %pod_8 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %18 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.writem %self[@s13] = %18 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.writem %self[@s12$inputs] = %pod_4 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %19 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.writem %self[@s12] = %19 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.writem %self[@s9$inputs] = %pod_2 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %20 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.writem %self[@s9] = %20 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.writem %self[@s1$inputs] = %pod_12 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %21 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + struct.writem %self[@s1] = %21 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + struct.writem %self[@s22$inputs] = %pod_46 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %22 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.writem %self[@s22] = %22 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.writem %self[@s5$inputs] = %pod_44 : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %23 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.writem %self[@s5] = %23 : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.writem %self[@out] = %nondet : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> + function.return %self : !struct.type<@RhoPi_80::@RhoPi_80<[]>> + } + function.def @constrain(%arg0: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_384 = felt.const 384 : <"babybear"> + %felt_const_576 = felt.const 576 : <"babybear"> + %felt_const_1408 = felt.const 1408 : <"babybear"> + %felt_const_896 = felt.const 896 : <"babybear"> + %felt_const_1280 = felt.const 1280 : <"babybear"> + %felt_const_128 = felt.const 128 : <"babybear"> + %felt_const_768 = felt.const 768 : <"babybear"> + %felt_const_832 = felt.const 832 : <"babybear"> + %felt_const_1216 = felt.const 1216 : <"babybear"> + %felt_const_1472 = felt.const 1472 : <"babybear"> + %felt_const_960 = felt.const 960 : <"babybear"> + %felt_const_256 = felt.const 256 : <"babybear"> + %felt_const_1536 = felt.const 1536 : <"babybear"> + %felt_const_1344 = felt.const 1344 : <"babybear"> + %felt_const_512 = felt.const 512 : <"babybear"> + %felt_const_1024 = felt.const 1024 : <"babybear"> + %felt_const_320 = felt.const 320 : <"babybear"> + %felt_const_192 = felt.const 192 : <"babybear"> + %felt_const_1152 = felt.const 1152 : <"babybear"> + %felt_const_1088 = felt.const 1088 : <"babybear"> + %felt_const_704 = felt.const 704 : <"babybear"> + %felt_const_448 = felt.const 448 : <"babybear"> + %felt_const_640 = felt.const 640 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@s2] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + %2 = struct.readm %arg0[@s2$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@s9] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + %4 = struct.readm %arg0[@s9$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@s12] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + %6 = struct.readm %arg0[@s12$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %7 = struct.readm %arg0[@s14] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + %8 = struct.readm %arg0[@s14$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %9 = struct.readm %arg0[@s13] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + %10 = struct.readm %arg0[@s13$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %11 = struct.readm %arg0[@s19] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + %12 = struct.readm %arg0[@s19$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %13 = struct.readm %arg0[@s1] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>> + %14 = struct.readm %arg0[@s1$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %15 = struct.readm %arg0[@s23] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + %16 = struct.readm %arg0[@s23$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %17 = struct.readm %arg0[@s8] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + %18 = struct.readm %arg0[@s8$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %19 = struct.readm %arg0[@s21] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + %20 = struct.readm %arg0[@s21$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %21 = struct.readm %arg0[@s4] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + %22 = struct.readm %arg0[@s4$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %23 = struct.readm %arg0[@s6] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>> + %24 = struct.readm %arg0[@s6$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %25 = struct.readm %arg0[@s15] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + %26 = struct.readm %arg0[@s15$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %27 = struct.readm %arg0[@s24] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + %28 = struct.readm %arg0[@s24$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %29 = struct.readm %arg0[@s16] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + %30 = struct.readm %arg0[@s16$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %31 = struct.readm %arg0[@s20] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + %32 = struct.readm %arg0[@s20$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %33 = struct.readm %arg0[@s3] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + %34 = struct.readm %arg0[@s3$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %35 = struct.readm %arg0[@s17] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + %36 = struct.readm %arg0[@s17$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %37 = struct.readm %arg0[@s18] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + %38 = struct.readm %arg0[@s18$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %39 = struct.readm %arg0[@s10] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + %40 = struct.readm %arg0[@s10$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %41 = struct.readm %arg0[@s7] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + %42 = struct.readm %arg0[@s7$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %43 = struct.readm %arg0[@s11] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + %44 = struct.readm %arg0[@s11$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %45 = struct.readm %arg0[@s5] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + %46 = struct.readm %arg0[@s5$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %47 = struct.readm %arg0[@s22] : <@RhoPi_80::@RhoPi_80<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + %48 = struct.readm %arg0[@s22$inputs] : <@RhoPi_80::@RhoPi_80<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = felt.add %73, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = cast.toindex %74 : !felt.type<"babybear"> + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %78 = cast.toindex %73 : !felt.type<"babybear"> + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %74 = cast.toindex %73 : !felt.type<"babybear"> + %75 = array.read %arg1[%74] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = cast.toindex %73 : !felt.type<"babybear"> + %77 = array.read %0[%76] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %77, %75 : !felt.type<"babybear">, !felt.type<"babybear"> + %78 = struct.readm %39[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> + %79 = cast.toindex %73 : !felt.type<"babybear"> + %80 = array.read %78[%79] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %81 = felt.add %73, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = cast.toindex %81 : !felt.type<"babybear"> + %83 = array.read %0[%82] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %84 = struct.readm %41[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %85 = cast.toindex %73 : !felt.type<"babybear"> + %86 = array.read %84[%85] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %87 = felt.add %73, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> + %88 = cast.toindex %87 : !felt.type<"babybear"> + %89 = array.read %0[%88] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> + %90 = struct.readm %43[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> + %91 = cast.toindex %73 : !felt.type<"babybear"> + %92 = array.read %90[%91] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %93 = felt.add %73, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = cast.toindex %93 : !felt.type<"babybear"> + %95 = array.read %0[%94] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %95, %92 : !felt.type<"babybear">, !felt.type<"babybear"> + %96 = struct.readm %35[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %97 = cast.toindex %73 : !felt.type<"babybear"> + %98 = array.read %96[%97] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %99 = felt.add %73, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> + %100 = cast.toindex %99 : !felt.type<"babybear"> + %101 = array.read %0[%100] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %101, %98 : !felt.type<"babybear">, !felt.type<"babybear"> + %102 = struct.readm %37[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> + %103 = cast.toindex %73 : !felt.type<"babybear"> + %104 = array.read %102[%103] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %105 = felt.add %73, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> + %106 = cast.toindex %105 : !felt.type<"babybear"> + %107 = array.read %0[%106] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %107, %104 : !felt.type<"babybear">, !felt.type<"babybear"> + %108 = struct.readm %33[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %109 = cast.toindex %73 : !felt.type<"babybear"> + %110 = array.read %108[%109] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %111 = felt.add %73, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = cast.toindex %111 : !felt.type<"babybear"> + %113 = array.read %0[%112] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %113, %110 : !felt.type<"babybear">, !felt.type<"babybear"> + %114 = struct.readm %45[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> + %115 = cast.toindex %73 : !felt.type<"babybear"> + %116 = array.read %114[%115] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %117 = felt.add %73, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> + %118 = cast.toindex %117 : !felt.type<"babybear"> + %119 = array.read %0[%118] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %119, %116 : !felt.type<"babybear">, !felt.type<"babybear"> + %120 = struct.readm %29[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %121 = cast.toindex %73 : !felt.type<"babybear"> + %122 = array.read %120[%121] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %123 = felt.add %73, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> + %124 = cast.toindex %123 : !felt.type<"babybear"> + %125 = array.read %0[%124] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %125, %122 : !felt.type<"babybear">, !felt.type<"babybear"> + %126 = struct.readm %17[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> + %127 = cast.toindex %73 : !felt.type<"babybear"> + %128 = array.read %126[%127] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %129 = felt.add %73, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> + %130 = cast.toindex %129 : !felt.type<"babybear"> + %131 = array.read %0[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> + %132 = struct.readm %19[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %133 = cast.toindex %73 : !felt.type<"babybear"> + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %135 = felt.add %73, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> + %136 = cast.toindex %135 : !felt.type<"babybear"> + %137 = array.read %0[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> + %138 = struct.readm %27[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> + %139 = cast.toindex %73 : !felt.type<"babybear"> + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %141 = felt.add %73, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> + %142 = cast.toindex %141 : !felt.type<"babybear"> + %143 = array.read %0[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> + %144 = struct.readm %21[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %145 = cast.toindex %73 : !felt.type<"babybear"> + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %147 = felt.add %73, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> + %148 = cast.toindex %147 : !felt.type<"babybear"> + %149 = array.read %0[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> + %150 = struct.readm %25[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> + %151 = cast.toindex %73 : !felt.type<"babybear"> + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %153 = felt.add %73, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> + %154 = cast.toindex %153 : !felt.type<"babybear"> + %155 = array.read %0[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> + %156 = struct.readm %15[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %157 = cast.toindex %73 : !felt.type<"babybear"> + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %159 = felt.add %73, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> + %160 = cast.toindex %159 : !felt.type<"babybear"> + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> + %162 = struct.readm %11[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> + %163 = cast.toindex %73 : !felt.type<"babybear"> + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %165 = felt.add %73, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> + %166 = cast.toindex %165 : !felt.type<"babybear"> + %167 = array.read %0[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> + %168 = struct.readm %9[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %169 = cast.toindex %73 : !felt.type<"babybear"> + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %171 = felt.add %73, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> + %172 = cast.toindex %171 : !felt.type<"babybear"> + %173 = array.read %0[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> + %174 = struct.readm %5[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> + %175 = cast.toindex %73 : !felt.type<"babybear"> + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %177 = felt.add %73, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> + %178 = cast.toindex %177 : !felt.type<"babybear"> + %179 = array.read %0[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> + %180 = struct.readm %1[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %181 = cast.toindex %73 : !felt.type<"babybear"> + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %183 = felt.add %73, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> + %184 = cast.toindex %183 : !felt.type<"babybear"> + %185 = array.read %0[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> + %186 = struct.readm %31[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> + %187 = cast.toindex %73 : !felt.type<"babybear"> + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %189 = felt.add %73, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> + %190 = cast.toindex %189 : !felt.type<"babybear"> + %191 = array.read %0[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> + %192 = struct.readm %7[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %193 = cast.toindex %73 : !felt.type<"babybear"> + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %195 = felt.add %73, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> + %196 = cast.toindex %195 : !felt.type<"babybear"> + %197 = array.read %0[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> + %198 = struct.readm %47[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> + %199 = cast.toindex %73 : !felt.type<"babybear"> + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %201 = felt.add %73, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> + %202 = cast.toindex %201 : !felt.type<"babybear"> + %203 = array.read %0[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> + %204 = struct.readm %3[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> + %205 = cast.toindex %73 : !felt.type<"babybear"> + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %207 = felt.add %73, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> + %208 = cast.toindex %207 : !felt.type<"babybear"> + %209 = array.read %0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> + %210 = struct.readm %23[@out] : <@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">> + %211 = cast.toindex %73 : !felt.type<"babybear"> + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %213 = felt.add %73, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> + %214 = cast.toindex %213 : !felt.type<"babybear"> + %215 = array.read %0[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> + %216 = struct.readm %13[@out] : <@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">> + %217 = cast.toindex %73 : !felt.type<"babybear"> + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %219 = felt.add %73, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %220 = cast.toindex %219 : !felt.type<"babybear"> + %221 = array.read %0[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %49 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_22::@stepRhoPi_22::@constrain(%37, %49) : (!struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %50 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_31::@stepRhoPi_31::@constrain(%29, %50) : (!struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %51 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_49::@stepRhoPi_49::@constrain(%15, %51) : (!struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %52 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_25::@stepRhoPi_25::@constrain(%33, %52) : (!struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %53 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_43::@stepRhoPi_43::@constrain(%21, %53) : (!struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %54 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_46::@stepRhoPi_46::@constrain(%25, %54) : (!struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %55 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_10::@stepRhoPi_10::@constrain(%39, %55) : (!struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %56 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_40::@stepRhoPi_40::@constrain(%27, %56) : (!struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %57 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_52::@stepRhoPi_52::@constrain(%11, %57) : (!struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %58 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_61::@stepRhoPi_61::@constrain(%1, %58) : (!struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %59 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_34::@stepRhoPi_34::@constrain(%17, %59) : (!struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %60 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_37::@stepRhoPi_37::@constrain(%19, %60) : (!struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %61 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_19::@stepRhoPi_19::@constrain(%35, %61) : (!struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %62 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_67::@stepRhoPi_67::@constrain(%7, %62) : (!struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %63 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_76::@stepRhoPi_76::@constrain(%23, %63) : (!struct.type<@stepRhoPi_76::@stepRhoPi_76<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %64 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_13::@stepRhoPi_13::@constrain(%41, %64) : (!struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %65 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_64::@stepRhoPi_64::@constrain(%31, %65) : (!struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %66 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_16::@stepRhoPi_16::@constrain(%43, %66) : (!struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %67 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_55::@stepRhoPi_55::@constrain(%9, %67) : (!struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %68 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_58::@stepRhoPi_58::@constrain(%5, %68) : (!struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %69 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_73::@stepRhoPi_73::@constrain(%3, %69) : (!struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %70 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_79::@stepRhoPi_79::@constrain(%13, %70) : (!struct.type<@stepRhoPi_79::@stepRhoPi_79<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %71 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_70::@stepRhoPi_70::@constrain(%47, %71) : (!struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %72 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @stepRhoPi_28::@stepRhoPi_28::@constrain(%45, %72) : (!struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @XorArraySingle_81 { + struct.def @XorArraySingle_81 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArraySingle_81::@XorArraySingle_81<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %19 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %21 = function.call @XOR_1::@XOR_1::@compute(%19, %20) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %21 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %22 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%22] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %array_0[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %12[@b] = %felt_const_1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%13] = %12 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = array.read %array[%14] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.subi %16, %c1 : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.cmpi eq, %17, %c0 : index + scf.if %18 { + %19 = pod.read %12[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %21 = function.call @XOR_1::@XOR_1::@compute(%19, %20) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %15[@comp] = %21 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %22 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%22] = %15 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg1] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %2[%9] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %11 = pod.read %10[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg2] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg2] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @AND_82 { + struct.def @AND_82 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@AND_82::@AND_82<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_82::@AND_82<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_82::@AND_82<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_82::@AND_82<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @AndArray_83 { + struct.def @AndArray_83 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@AND_82::@AND_82<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_83::@AndArray_83<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@AndArray_83::@AndArray_83<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @AND_82::@AND_82::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_82::@AND_82<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @AND_82::@AND_82::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_82::@AND_82<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + %4 = struct.readm %3[@out] : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@AND_82::@AND_82<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@AND_82::@AND_82<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_82::@AND_82<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@AND_82::@AND_82<[]>>>, !struct.type<@AND_82::@AND_82<[]>> + } + struct.writem %self[@aux] = %array_1 : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !struct.type<@AND_82::@AND_82<[]>>> + struct.writem %self[@out] = %nondet : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@AndArray_83::@AndArray_83<[]>> + } + function.def @constrain(%arg0: !struct.type<@AndArray_83::@AndArray_83<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !struct.type<@AND_82::@AND_82<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@AND_82::@AND_82<[]>>>, !struct.type<@AND_82::@AND_82<[]>> + %6 = struct.readm %5[@out] : <@AND_82::@AND_82<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@AND_82::@AND_82<[]>>>, !struct.type<@AND_82::@AND_82<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_82::@AND_82::@constrain(%3, %5, %6) : (!struct.type<@AND_82::@AND_82<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @stepChi_84 { + struct.def @stepChi_84 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @bXor : !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + struct.member @bXor$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @abc : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @abc$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @bc : !struct.type<@AndArray_83::@AndArray_83<[]>> + struct.member @bc$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepChi_84::@stepChi_84<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @XorArraySingle_81::@XorArraySingle_81::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + %5 = struct.readm %4[@out] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @AndArray_83::@AndArray_83::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_83::@AndArray_83<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_3[@count] = %18 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @AndArray_83::@AndArray_83::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@AndArray_83::@AndArray_83<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %11 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + %12 = struct.readm %11[@out] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@abc$inputs] = %pod_2 : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@abc] = %0 : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@bXor$inputs] = %pod_0 : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + struct.writem %self[@bXor] = %1 : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + struct.writem %self[@bc$inputs] = %pod_4 : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@AndArray_83::@AndArray_83<[]>>, @params: !pod.type<[]>]>, !struct.type<@AndArray_83::@AndArray_83<[]>> + struct.writem %self[@bc] = %2 : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@AndArray_83::@AndArray_83<[]>> + struct.writem %self[@out] = %nondet : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepChi_84::@stepChi_84<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepChi_84::@stepChi_84<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@bXor] : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>> + %2 = struct.readm %arg0[@bXor$inputs] : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@abc] : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %4 = struct.readm %arg0[@abc$inputs] : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@bc] : <@stepChi_84::@stepChi_84<[]>>, !struct.type<@AndArray_83::@AndArray_83<[]>> + %6 = struct.readm %arg0[@bc$inputs] : <@stepChi_84::@stepChi_84<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = struct.readm %1[@out] : <@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %12 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %12 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %arg3[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg1[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %12 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c64 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %13 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %12 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %0[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%3, %7, %8) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArraySingle_81::@XorArraySingle_81::@constrain(%1, %9) : (!struct.type<@XorArraySingle_81::@XorArraySingle_81<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @AndArray_83::@AndArray_83::@constrain(%5, %10, %11) : (!struct.type<@AndArray_83::@AndArray_83<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Chi_85 { + struct.def @Chi_85 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @r20 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r10 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r15 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r21 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r22 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r2 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r0 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r8 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r17 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r23 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r5 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r14 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r1 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r4 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r7 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r19 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r6 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r3 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r12 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r18 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r24 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r9 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r13 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r11 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r16 : !struct.type<@stepChi_84::@stepChi_84<[]>> + struct.member @r16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c192 = arith.constant {product_source = "compute"} 192 : index + %self = struct.new : <@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %153 = array.read %arg0[%152] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %154 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %154[%155] = %153 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %154 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %157 = arith.subi %156, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %157 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.cmpi eq, %157, %c0 {product_source = "compute"} : index + scf.if %158 { + %175 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %159 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "compute"} + %161 = array.read %arg0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %162 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %162[%163] = %161 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %162 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %165 = arith.subi %164, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %165 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.cmpi eq, %165, %c0 {product_source = "compute"} : index + scf.if %166 { + %175 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %167 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %arg0[%168] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %170[%171] = %169 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@c] = %170 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %173 = arith.subi %172, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %173 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.cmpi eq, %173, %c0 {product_source = "compute"} : index + scf.if %174 { + %175 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %175 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %161 = array.read %arg0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %162 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %162[%163] = %161 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %162 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %165 = arith.subi %164, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %165 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.cmpi eq, %165, %c0 {product_source = "compute"} : index + scf.if %166 { + %175 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %167 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %arg0[%168] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %170[%171] = %169 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@c] = %170 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %173 = arith.subi %172, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %173 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.cmpi eq, %173, %c0 {product_source = "compute"} : index + scf.if %174 { + %175 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %176 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = function.call @stepChi_84::@stepChi_84::@compute(%175, %176, %177) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %178 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %155[%156] = %154 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %155 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %158 = arith.subi %157, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %158 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %159 = arith.cmpi eq, %158, %c0 {product_source = "compute"} : index + scf.if %159 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %160 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "compute"} + %162 = array.read %arg0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %163[%164] = %162 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %163 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %166 = arith.subi %165, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %166 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %167 = arith.cmpi eq, %166, %c0 {product_source = "compute"} : index + scf.if %167 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %168 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %arg0[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %172 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %171[%172] = %170 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@c] = %171 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %173 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %174 = arith.subi %173, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %174 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %175 = arith.cmpi eq, %174, %c0 {product_source = "compute"} : index + scf.if %175 { + %176 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %178 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @stepChi_84::@stepChi_84::@compute(%176, %177, %178) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %179 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %152 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %153 = struct.readm %152[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %154 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %155 = array.read %153[%154] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%156] = %155 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %157 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %158 = struct.readm %157[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %159 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %160 = array.read %158[%159] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %162 = cast.toindex %161 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%162] = %160 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %164 = struct.readm %163[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %166 = array.read %164[%165] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%168] = %166 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %169 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %170 = struct.readm %169[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %172 = array.read %170[%171] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %174 = cast.toindex %173 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%174] = %172 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %175 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %176 = struct.readm %175[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %177 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %178 = array.read %176[%177] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %179 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %180 = cast.toindex %179 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%180] = %178 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %181 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %182 = struct.readm %181[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %183 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %184 = array.read %182[%183] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %185 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %186 = cast.toindex %185 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%186] = %184 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %187 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %188 = struct.readm %187[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %189 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %190 = array.read %188[%189] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %191 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%192] = %190 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %193 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %194 = struct.readm %193[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %197 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %198 = cast.toindex %197 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%198] = %196 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %199 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %200 = struct.readm %199[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %201 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %204 = cast.toindex %203 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%204] = %202 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %206 = struct.readm %205[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %208 = array.read %206[%207] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %209 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %210 = cast.toindex %209 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%210] = %208 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %212 = struct.readm %211[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %214 = array.read %212[%213] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %215 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%216] = %214 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %217 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %218 = struct.readm %217[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %219 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %220 = array.read %218[%219] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %221 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %222 = cast.toindex %221 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%222] = %220 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %223 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %224 = struct.readm %223[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %225 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %224[%225] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %228 = cast.toindex %227 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%228] = %226 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %229 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %230 = struct.readm %229[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %231 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %232 = array.read %230[%231] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %233 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %234 = cast.toindex %233 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%234] = %232 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %235 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %236 = struct.readm %235[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %238 = array.read %236[%237] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %239 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %240 = cast.toindex %239 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%240] = %238 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %241 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %242 = struct.readm %241[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %243 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %244 = array.read %242[%243] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %245 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %246 = cast.toindex %245 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%246] = %244 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %247 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %248 = struct.readm %247[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %249 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %250 = array.read %248[%249] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %251 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %252 = cast.toindex %251 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%252] = %250 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %253 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %254 = struct.readm %253[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %255 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %256 = array.read %254[%255] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %257 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %258 = cast.toindex %257 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%258] = %256 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %259 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %260 = struct.readm %259[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %261 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %262 = array.read %260[%261] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %263 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %264 = cast.toindex %263 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%264] = %262 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %265 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %266 = struct.readm %265[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %267 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %268 = array.read %266[%267] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %269 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %270 = cast.toindex %269 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%270] = %268 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %271 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %272 = struct.readm %271[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %273 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %274 = array.read %272[%273] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %275 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %276 = cast.toindex %275 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%276] = %274 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %277 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %278 = struct.readm %277[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %279 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %280 = array.read %278[%279] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %281 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %282 = cast.toindex %281 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%282] = %280 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %283 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %284 = struct.readm %283[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %285 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %286 = array.read %284[%285] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %287 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %288 = cast.toindex %287 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%288] = %286 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %289 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %290 = struct.readm %289[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %291 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %292 = array.read %290[%291] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %293 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %294 = cast.toindex %293 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%294] = %292 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %295 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %296 = struct.readm %295[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %297 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "compute"} + %298 = array.read %296[%297] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %299 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %300 = cast.toindex %299 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%300] = %298 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_20 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %0 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_4 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %1 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_16 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %2 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_34 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %3 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_38 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %4 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_40 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %5 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_28 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %6 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_8 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %7 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_2 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %8 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_36 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %9 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_46 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %10 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_48 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %11 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_12 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %12 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_18 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %13 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_22 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %14 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_14 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %15 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_0 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %16 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_26 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %17 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_32 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %18 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_24 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %19 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_42 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %20 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_6 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %21 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_10 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %22 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_44 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %23 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_30 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %24 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %25 = struct.readm %self[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = struct.readm %self[@r20] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %27 = struct.readm %self[@r20$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %28 = struct.readm %self[@r10] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %29 = struct.readm %self[@r10$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %30 = struct.readm %self[@r15] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %31 = struct.readm %self[@r15$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %32 = struct.readm %self[@r21] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %33 = struct.readm %self[@r21$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = struct.readm %self[@r22] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %35 = struct.readm %self[@r22$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %36 = struct.readm %self[@r2] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@r2$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = struct.readm %self[@r0] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@r0$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@r8] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@r8$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@r17] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@r17$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %44 = struct.readm %self[@r23] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@r23$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@r5] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@r5$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@r14] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@r14$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@r1] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@r1$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %52 = struct.readm %self[@r4] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %53 = struct.readm %self[@r4$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = struct.readm %self[@r7] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %55 = struct.readm %self[@r7$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %56 = struct.readm %self[@r19] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %57 = struct.readm %self[@r19$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = struct.readm %self[@r6] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %59 = struct.readm %self[@r6$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %60 = struct.readm %self[@r3] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %61 = struct.readm %self[@r3$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %62 = struct.readm %self[@r12] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %63 = struct.readm %self[@r12$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %64 = struct.readm %self[@r18] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %65 = struct.readm %self[@r18$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %66 = struct.readm %self[@r24] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %67 = struct.readm %self[@r24$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %68 = struct.readm %self[@r9] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %69 = struct.readm %self[@r9$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %70 = struct.readm %self[@r13] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %71 = struct.readm %self[@r13$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %72 = struct.readm %self[@r11] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %73 = struct.readm %self[@r11$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %74 = struct.readm %self[@r16] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %75 = struct.readm %self[@r16$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %153 = array.read %arg0[%152] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %154 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %156 = array.read %154[%155] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %156, %153 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg0[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg0[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %51[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %61[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg0[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg0[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %41[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %69[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %29[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %29[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %29[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %73[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %63[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %71[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %49[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %31[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %31[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %31[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %75[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %43[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %27[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %27[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %27[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %33[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %33[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %33[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %35[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %35[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %35[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %arg0[%153] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "constrain"} + %160 = array.read %arg0[%159] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %161 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %163, %160 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "constrain"} + %166 = array.read %arg0[%165] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %67[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %169, %166 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %151 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %152 = struct.readm %38[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %154 = array.read %152[%153] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %155 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %156 = array.read %25[%155] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %156, %154 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %50[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %151, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %25[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %36[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = felt.add %151, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %167 = cast.toindex %166 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %25[%167] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = struct.readm %60[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %170 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %169[%170] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = felt.add %151, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %173 = cast.toindex %172 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %25[%173] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = struct.readm %52[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %176 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %175[%176] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = felt.add %151, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %179 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %25[%179] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = struct.readm %46[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %182 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %181[%182] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = felt.add %151, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %185 = cast.toindex %184 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %25[%185] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %187 = struct.readm %58[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %188 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %189 = array.read %187[%188] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %190 = felt.add %151, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %191 = cast.toindex %190 : !felt.type<"babybear"> {product_source = "constrain"} + %192 = array.read %25[%191] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %192, %189 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = struct.readm %54[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %194 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %196 = felt.add %151, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "constrain"} + %198 = array.read %25[%197] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %198, %195 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = struct.readm %40[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %200 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %201 = array.read %199[%200] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %202 = felt.add %151, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %203 = cast.toindex %202 : !felt.type<"babybear"> {product_source = "constrain"} + %204 = array.read %25[%203] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %204, %201 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = struct.readm %68[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %206 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %207 = array.read %205[%206] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %208 = felt.add %151, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "constrain"} + %210 = array.read %25[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %210, %207 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = struct.readm %28[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %212 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %213 = array.read %211[%212] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %214 = felt.add %151, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %215 = cast.toindex %214 : !felt.type<"babybear"> {product_source = "constrain"} + %216 = array.read %25[%215] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %216, %213 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = struct.readm %72[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %218 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %219 = array.read %217[%218] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %220 = felt.add %151, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %221 = cast.toindex %220 : !felt.type<"babybear"> {product_source = "constrain"} + %222 = array.read %25[%221] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %222, %219 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %223 = struct.readm %62[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %224 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %225 = array.read %223[%224] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %226 = felt.add %151, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %227 = cast.toindex %226 : !felt.type<"babybear"> {product_source = "constrain"} + %228 = array.read %25[%227] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %228, %225 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %229 = struct.readm %70[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %230 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %231 = array.read %229[%230] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %232 = felt.add %151, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %233 = cast.toindex %232 : !felt.type<"babybear"> {product_source = "constrain"} + %234 = array.read %25[%233] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %234, %231 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %235 = struct.readm %48[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %236 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %237 = array.read %235[%236] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %238 = felt.add %151, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %239 = cast.toindex %238 : !felt.type<"babybear"> {product_source = "constrain"} + %240 = array.read %25[%239] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %240, %237 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %241 = struct.readm %30[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %242 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %243 = array.read %241[%242] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %244 = felt.add %151, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %245 = cast.toindex %244 : !felt.type<"babybear"> {product_source = "constrain"} + %246 = array.read %25[%245] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %246, %243 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %247 = struct.readm %74[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %248 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %249 = array.read %247[%248] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %250 = felt.add %151, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %251 = cast.toindex %250 : !felt.type<"babybear"> {product_source = "constrain"} + %252 = array.read %25[%251] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %252, %249 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %253 = struct.readm %42[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %254 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %255 = array.read %253[%254] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %256 = felt.add %151, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %257 = cast.toindex %256 : !felt.type<"babybear"> {product_source = "constrain"} + %258 = array.read %25[%257] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %258, %255 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %259 = struct.readm %64[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %260 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %261 = array.read %259[%260] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %262 = felt.add %151, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %263 = cast.toindex %262 : !felt.type<"babybear"> {product_source = "constrain"} + %264 = array.read %25[%263] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %264, %261 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %265 = struct.readm %56[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %266 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %267 = array.read %265[%266] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %268 = felt.add %151, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %269 = cast.toindex %268 : !felt.type<"babybear"> {product_source = "constrain"} + %270 = array.read %25[%269] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %270, %267 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %271 = struct.readm %26[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %272 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %273 = array.read %271[%272] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %274 = felt.add %151, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %275 = cast.toindex %274 : !felt.type<"babybear"> {product_source = "constrain"} + %276 = array.read %25[%275] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %276, %273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %277 = struct.readm %32[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %278 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %279 = array.read %277[%278] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %280 = felt.add %151, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %281 = cast.toindex %280 : !felt.type<"babybear"> {product_source = "constrain"} + %282 = array.read %25[%281] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %282, %279 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %283 = struct.readm %34[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %284 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %285 = array.read %283[%284] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %286 = felt.add %151, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %287 = cast.toindex %286 : !felt.type<"babybear"> {product_source = "constrain"} + %288 = array.read %25[%287] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %288, %285 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %289 = struct.readm %44[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %290 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %291 = array.read %289[%290] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %292 = felt.add %151, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %293 = cast.toindex %292 : !felt.type<"babybear"> {product_source = "constrain"} + %294 = array.read %25[%293] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %294, %291 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %295 = struct.readm %66[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %296 = cast.toindex %151 : !felt.type<"babybear"> {product_source = "constrain"} + %297 = array.read %295[%296] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %298 = felt.add %151, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %299 = cast.toindex %298 : !felt.type<"babybear"> {product_source = "constrain"} + %300 = array.read %25[%299] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %300, %297 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %76 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %47[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%46, %76, %77, %78) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %79 = pod.read %31[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %31[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = pod.read %31[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%30, %79, %80, %81) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %82 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = pod.read %43[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%42, %82, %83, %84) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %85 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %87 = pod.read %61[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%60, %85, %86, %87) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %88 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = pod.read %65[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%64, %88, %89, %90) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %91 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %93 = pod.read %67[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%66, %91, %92, %93) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %94 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %95 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %96 = pod.read %55[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%54, %94, %95, %96) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %97 = pod.read %35[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %35[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %99 = pod.read %35[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%34, %97, %98, %99) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %100 = pod.read %29[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %101 = pod.read %29[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = pod.read %29[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%28, %100, %101, %102) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %103 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %105 = pod.read %63[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%62, %103, %104, %105) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %106 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %108 = pod.read %73[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%72, %106, %107, %108) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %109 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %75[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%74, %109, %110, %111) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %114 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%38, %112, %113, %114) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %115 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %117 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%44, %115, %116, %117) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %118 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %49[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%48, %118, %119, %120) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %121 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %41[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%40, %121, %122, %123) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %124 = pod.read %27[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %27[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %126 = pod.read %27[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%26, %124, %125, %126) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %127 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %53[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%52, %127, %128, %129) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %130 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%58, %130, %131, %132) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %133 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %134 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %51[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%50, %133, %134, %135) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = pod.read %69[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%68, %136, %137, %138) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %139 = pod.read %33[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %33[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %33[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%32, %139, %140, %141) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %142 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = pod.read %37[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%36, %142, %143, %144) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %145 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %147 = pod.read %71[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%70, %145, %146, %147) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %148 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %150 = pod.read %57[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%56, %148, %149, %150) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Chi_85::@Chi_85<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c192 = arith.constant {product_source = "compute"} 192 : index + %self = struct.new : <@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %31 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %49 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %33 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %arg0[%34] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %36 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %39 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg0[%42] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45] = %43 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@c] = %44 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %47 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %49 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %49 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %arg0[%34] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %36 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %39 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %49 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %arg0[%42] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %44[%45] = %43 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@c] = %44 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %47 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %49 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @stepChi_84::@stepChi_84::@compute(%49, %50, %51) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %52 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %29 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %32 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %34 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg0[%35] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38] = %36 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %37 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %40 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + %42 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %arg0[%43] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@c] = %45 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %48 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = function.call @stepChi_84::@stepChi_84::@compute(%50, %51, %52) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %53 : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %25 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %27 = struct.readm %26[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %27[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%30] = %29 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %32[%33] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.add %25, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%36] = %34 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %38[%39] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %25, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %40 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %44[%45] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %25, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%48] = %46 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %50 = struct.readm %49[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %50[%51] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %25, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %52 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %56 = struct.readm %55[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %56[%57] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %25, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%60] = %58 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %62[%63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = felt.add %25, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%66] = %64 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %67 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %68 = struct.readm %67[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %69 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %68[%69] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = felt.add %25, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%72] = %70 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %74 = struct.readm %73[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %75 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %74[%75] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %25, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%78] = %76 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %80 = struct.readm %79[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %80[%81] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = felt.add %25, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %83 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%84] = %82 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %87 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %86[%87] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = felt.add %25, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %90 = cast.toindex %89 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%90] = %88 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %92 = struct.readm %91[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %92[%93] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %95 = felt.add %25, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %95 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%96] = %94 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %97 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %99 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %98[%99] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %25, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%102] = %100 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %103 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %104 = struct.readm %103[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %105 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %106 = array.read %104[%105] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %107 = felt.add %25, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %108 = cast.toindex %107 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%108] = %106 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %109 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %110 = struct.readm %109[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %111 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %112 = array.read %110[%111] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %113 = felt.add %25, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %114 = cast.toindex %113 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%114] = %112 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %115 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %116 = struct.readm %115[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %117 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %116[%117] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %119 = felt.add %25, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %120 = cast.toindex %119 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%120] = %118 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %121 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %122 = struct.readm %121[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %123 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %122[%123] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %125 = felt.add %25, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %125 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%126] = %124 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %127 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %128 = struct.readm %127[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %129 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %130 = array.read %128[%129] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %131 = felt.add %25, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %132 = cast.toindex %131 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%132] = %130 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %133 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %134 = struct.readm %133[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %135 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %136 = array.read %134[%135] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %137 = felt.add %25, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %138 = cast.toindex %137 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%138] = %136 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %139 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %140 = struct.readm %139[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %141 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %142 = array.read %140[%141] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %143 = felt.add %25, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %144 = cast.toindex %143 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%144] = %142 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %145 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %146 = struct.readm %145[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %147 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %148 = array.read %146[%147] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %149 = felt.add %25, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %150 = cast.toindex %149 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%150] = %148 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %151 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %152 = struct.readm %151[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %153 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %154 = array.read %152[%153] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = felt.add %25, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %156 = cast.toindex %155 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%156] = %154 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %157 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %158 = struct.readm %157[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %159 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %160 = array.read %158[%159] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = felt.add %25, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %162 = cast.toindex %161 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%162] = %160 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %163 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %164 = struct.readm %163[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %165 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %166 = array.read %164[%165] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = felt.add %25, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %168 = cast.toindex %167 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%168] = %166 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %169 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + %170 = struct.readm %169[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %171 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %172 = array.read %170[%171] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = felt.add %25, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %174 = cast.toindex %173 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%174] = %172 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_20 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %0 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_4 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %1 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_16 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %2 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_34 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %3 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_38 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %4 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_40 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %5 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_28 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %6 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_8 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %7 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_2 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %8 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_36 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %9 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_46 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %10 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_48 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %11 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_12 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %12 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_18 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %13 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_22 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %14 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_14 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %15 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_0 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %16 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_26 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %17 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_32 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %18 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_24 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %19 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_42 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %20 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_6 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %21 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_10 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %22 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_44 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %23 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_30 : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepChi_84::@stepChi_84<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %24 : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Chi_85::@Chi_85<[]>> + } + function.def @constrain(%arg0: !struct.type<@Chi_85::@Chi_85<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@r20] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@r20$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@r10] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@r10$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@r15] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@r15$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@r21] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@r21$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@r22] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@r22$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@r2] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@r2$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@r0] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@r0$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@r8] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@r8$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@r17] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@r17$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@r23] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@r23$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@r5] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@r5$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@r14] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@r14$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@r1] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@r1$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@r4] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@r4$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@r7] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@r7$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@r19] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@r19$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@r6] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@r6$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@r3] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@r3$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@r12] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@r12$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@r18] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@r18$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@r24] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@r24$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@r9] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@r9$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@r13] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@r13$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@r11] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@r11$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %arg0[@r16] : <@Chi_85::@Chi_85<[]>>, !struct.type<@stepChi_84::@stepChi_84<[]>> {product_source = "constrain"} + %50 = struct.readm %arg0[@r16$inputs] : <@Chi_85::@Chi_85<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %128 = array.read %arg1[%127] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %129 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %130 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %129[%130] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = cast.toindex %132 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %arg1[%133] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %135[%136] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %arg1[%139] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %141[%142] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %arg1[%133] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %135[%136] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = cast.toindex %138 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %arg1[%139] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %141[%142] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %arg1[%128] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %132 = array.read %130[%131] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %134 = cast.toindex %133 : !felt.type<"babybear"> {product_source = "constrain"} + %135 = array.read %arg1[%134] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %136 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %138 = array.read %136[%137] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %135 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %140 = cast.toindex %139 : !felt.type<"babybear"> {product_source = "constrain"} + %141 = array.read %arg1[%140] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %142 = pod.read %42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %144 = array.read %142[%143] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %144, %141 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %126 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %127 = struct.readm %13[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %129 = array.read %127[%128] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %130 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %0[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %129 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = struct.readm %25[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = felt.add %126, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %136 = cast.toindex %135 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %0[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = struct.readm %11[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = felt.add %126, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %142 = cast.toindex %141 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %0[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %144 = struct.readm %35[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %147 = felt.add %126, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %148 = cast.toindex %147 : !felt.type<"babybear"> {product_source = "constrain"} + %149 = array.read %0[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %150 = struct.readm %27[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %153 = felt.add %126, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %154 = cast.toindex %153 : !felt.type<"babybear"> {product_source = "constrain"} + %155 = array.read %0[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %156 = struct.readm %21[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = felt.add %126, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %33[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = felt.add %126, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %166 = cast.toindex %165 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %0[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = struct.readm %29[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = felt.add %126, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %172 = cast.toindex %171 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %0[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = struct.readm %15[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = felt.add %126, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %178 = cast.toindex %177 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %0[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = struct.readm %43[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %181 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = felt.add %126, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %184 = cast.toindex %183 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %0[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %186 = struct.readm %3[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %187 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %189 = felt.add %126, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %190 = cast.toindex %189 : !felt.type<"babybear"> {product_source = "constrain"} + %191 = array.read %0[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %47[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %126, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %0[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %37[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = felt.add %126, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %202 = cast.toindex %201 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %0[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = struct.readm %45[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %205 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = felt.add %126, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = struct.readm %23[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %211 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = felt.add %126, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %214 = cast.toindex %213 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %0[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = struct.readm %5[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %217 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = felt.add %126, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %220 = cast.toindex %219 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %0[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %222 = struct.readm %49[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %223 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %224 = array.read %222[%223] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %225 = felt.add %126, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %226 = cast.toindex %225 : !felt.type<"babybear"> {product_source = "constrain"} + %227 = array.read %0[%226] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %227, %224 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %228 = struct.readm %17[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %229 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %230 = array.read %228[%229] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %231 = felt.add %126, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %232 = cast.toindex %231 : !felt.type<"babybear"> {product_source = "constrain"} + %233 = array.read %0[%232] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %233, %230 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %234 = struct.readm %39[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %235 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %236 = array.read %234[%235] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %237 = felt.add %126, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %238 = cast.toindex %237 : !felt.type<"babybear"> {product_source = "constrain"} + %239 = array.read %0[%238] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %239, %236 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %240 = struct.readm %31[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %241 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %242 = array.read %240[%241] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %243 = felt.add %126, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %244 = cast.toindex %243 : !felt.type<"babybear"> {product_source = "constrain"} + %245 = array.read %0[%244] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %245, %242 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %246 = struct.readm %1[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %247 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %248 = array.read %246[%247] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %249 = felt.add %126, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %250 = cast.toindex %249 : !felt.type<"babybear"> {product_source = "constrain"} + %251 = array.read %0[%250] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %251, %248 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %252 = struct.readm %7[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %253 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %254 = array.read %252[%253] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %255 = felt.add %126, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %256 = cast.toindex %255 : !felt.type<"babybear"> {product_source = "constrain"} + %257 = array.read %0[%256] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %257, %254 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %258 = struct.readm %9[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %259 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %260 = array.read %258[%259] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %261 = felt.add %126, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %262 = cast.toindex %261 : !felt.type<"babybear"> {product_source = "constrain"} + %263 = array.read %0[%262] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %263, %260 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %264 = struct.readm %19[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %265 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %266 = array.read %264[%265] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %267 = felt.add %126, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %268 = cast.toindex %267 : !felt.type<"babybear"> {product_source = "constrain"} + %269 = array.read %0[%268] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %269, %266 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %270 = struct.readm %41[@out] : <@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %271 = cast.toindex %126 : !felt.type<"babybear"> {product_source = "constrain"} + %272 = array.read %270[%271] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %273 = felt.add %126, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %274 = cast.toindex %273 : !felt.type<"babybear"> {product_source = "constrain"} + %275 = array.read %0[%274] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %275, %272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %51 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = pod.read %22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%21, %51, %52, %53) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %54 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = pod.read %6[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%5, %54, %55, %56) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %57 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = pod.read %18[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%17, %57, %58, %59) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %60 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = pod.read %36[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%35, %60, %61, %62) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %63 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = pod.read %40[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%39, %63, %64, %65) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %66 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = pod.read %42[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%41, %66, %67, %68) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %69 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %70 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = pod.read %30[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%29, %69, %70, %71) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %72 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %73 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%9, %72, %73, %74) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%3, %75, %76, %77) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %78 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %79 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = pod.read %38[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%37, %78, %79, %80) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %81 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%47, %81, %82, %83) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %84 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %85 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %50[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%49, %84, %85, %86) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %87 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %89 = pod.read %14[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%13, %87, %88, %89) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %90 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %91 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %20[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%19, %90, %91, %92) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %94 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %95 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%23, %93, %94, %95) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %96 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %97 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %16[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%15, %96, %97, %98) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %99 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %100 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %101 = pod.read %2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%1, %99, %100, %101) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %102 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %103 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %28[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%27, %102, %103, %104) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %105 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %106 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %34[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%33, %105, %106, %107) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %108 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %26[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%25, %108, %109, %110) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %111 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %112 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %44[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%43, %111, %112, %113) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %114 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%7, %114, %115, %116) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %117 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %118 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %12[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%11, %117, %118, %119) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %120 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = pod.read %46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%45, %120, %121, %122) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %123 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %32[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepChi_84::@stepChi_84::@constrain(%31, %123, %124, %125) : (!struct.type<@stepChi_84::@stepChi_84<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @RC_86 { + struct.def @RC_86 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@RC_86::@RC_86<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_86::@RC_86<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %felt_const_9223372039002292353, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.shr %felt_const_9223372039002292353, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.bit_and %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@RC_86::@RC_86<[]>> + } + function.def @compute() -> !struct.type<@RC_86::@RC_86<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "compute"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "compute"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "compute"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "compute"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "compute"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "compute"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "compute"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "compute"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "compute"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "compute"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "compute"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@RC_86::@RC_86<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg0 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg0 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_9223372039002292353, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %2 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@RC_86::@RC_86<[]>> + } + function.def @constrain(%arg0: !struct.type<@RC_86::@RC_86<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c64 = arith.constant 64 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_9223372039002292232 = felt.const 9223372039002292232 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808704 = felt.const 9223372036854808704 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002259466 = felt.const 9223372039002259466 : <"babybear"> {product_source = "constrain"} + %felt_const_32778 = felt.const 32778 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775936 = felt.const 9223372036854775936 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808578 = felt.const 9223372036854808578 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808579 = felt.const 9223372036854808579 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808713 = felt.const 9223372036854808713 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854775947 = felt.const 9223372036854775947 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516555 = felt.const 2147516555 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483658 = felt.const 2147483658 : <"babybear"> {product_source = "constrain"} + %felt_const_2147516425 = felt.const 2147516425 : <"babybear"> {product_source = "constrain"} + %felt_const_136 = felt.const 136 : <"babybear"> {product_source = "constrain"} + %felt_const_138 = felt.const 138 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808585 = felt.const 9223372036854808585 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292353 = felt.const 9223372039002292353 : <"babybear"> {product_source = "constrain"} + %felt_const_2147483649 = felt.const 2147483649 : <"babybear"> {product_source = "constrain"} + %felt_const_32907 = felt.const 32907 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372039002292224 = felt.const 9223372039002292224 : <"babybear"> {product_source = "constrain"} + %felt_const_9223372036854808714 = felt.const 9223372036854808714 : <"babybear"> {product_source = "constrain"} + %felt_const_32898 = felt.const 32898 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<24 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_1 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_32898 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_9223372036854808714 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_9223372039002292224 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_32907 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_9223372036854808585 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_138 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_136 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_2147516425 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_2147483658 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_2147516555 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_9223372036854775947 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_9223372036854808713 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_9223372036854808579 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_9223372036854808578 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_9223372036854775936 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_32778 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_9223372039002259466 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_9223372039002292353 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_9223372036854808704 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_2147483649 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_9223372039002292232 : <24 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.shr %felt_const_9223372039002292353, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Iota_87 { + struct.def @Iota_87 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @iota : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @iota$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @rc : !struct.type<@RC_86::@RC_86<[]>> + struct.member @rc$inputs : !pod.type<[]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_86::@RC_86::@product() : () -> !struct.type<@RC_86::@RC_86<[]>> + %1 = function.call @RC_86::@RC_86::@compute() : () -> !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %14 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %23 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %26 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @XorArray_2::@XorArray_2::@compute(%28, %29) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_0 : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %2 : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_3 : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "compute"} + %3 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %3 : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@iota] : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@iota$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@rc] : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@rc$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %7[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %4[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %4[%14] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%5, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.call @RC_86::@RC_86::@constrain(%7) : (!struct.type<@RC_86::@RC_86<[]>>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Iota_87::@Iota_87<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1600 = arith.constant 1600 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @RC_86::@RC_86::@compute() : () -> !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c64 to %c1600 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_0 : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %1 : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@rc$inputs] = %pod_3 : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "compute"} + %2 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@RC_86::@RC_86<[]>>, @params: !pod.type<[]>]>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@rc] = %2 : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Iota_87::@Iota_87<[]>> + } + function.def @constrain(%arg0: !struct.type<@Iota_87::@Iota_87<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1600 = arith.constant 1600 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@iota] : <@Iota_87::@Iota_87<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@iota$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@rc] : <@Iota_87::@Iota_87<[]>>, !struct.type<@RC_86::@RC_86<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@rc$inputs] : <@Iota_87::@Iota_87<[]>>, !pod.type<[]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %3[@out] : <@RC_86::@RC_86<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c64 to %c1600 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%1, %5, %6) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.call @RC_86::@RC_86::@constrain(%3) : (!struct.type<@RC_86::@RC_86<[]>>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @KeccakfRound_88 { + struct.def @KeccakfRound_88 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @rhopi : !struct.type<@RhoPi_80::@RhoPi_80<[]>> + struct.member @rhopi$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + struct.member @theta : !struct.type<@Theta_9::@Theta_9<[]>> + struct.member @theta$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + struct.member @chi : !struct.type<@Chi_85::@Chi_85<[]>> + struct.member @chi$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + struct.member @iota : !struct.type<@Iota_87::@Iota_87<[]>> + struct.member @iota$inputs : !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c1600 = arith.constant {product_source = "compute"} 1600 : index + %self = struct.new : <@KeccakfRound_88::@KeccakfRound_88<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg0[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %20 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @Theta_9::@Theta_9::@product(%25) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> + %27 = function.call @Theta_9::@Theta_9::@compute(%25) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %26 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %22 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %25 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @RhoPi_80::@RhoPi_80::@compute(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %28 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %22 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %25 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Chi_85::@Chi_85::@product(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> + %29 = function.call @Chi_85::@Chi_85::@compute(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %28 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %22 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %25 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Iota_87::@Iota_87::@product(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> + %29 = function.call @Iota_87::@Iota_87::@compute(%27) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %28 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%22] = %21 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@theta$inputs] = %pod_2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@theta] = %0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@chi$inputs] = %pod_4 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@chi] = %1 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@rhopi$inputs] = %pod_0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@rhopi] = %2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_6 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %3 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@rhopi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@rhopi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@theta] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@theta$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %self[@chi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "constrain"} + %10 = struct.readm %self[@chi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %self[@iota] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@iota$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %7[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %5[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %10[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %9[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %12[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %11[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %4[%21] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %13 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Theta_9::@Theta_9::@constrain(%7, %13) : (!struct.type<@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %14 = pod.read %10[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Chi_85::@Chi_85::@constrain(%9, %14) : (!struct.type<@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %15 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @RhoPi_80::@RhoPi_80::@constrain(%5, %15) : (!struct.type<@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %16 = pod.read %12[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Iota_87::@Iota_87::@constrain(%11, %16) : (!struct.type<@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c1600 = arith.constant {product_source = "compute"} 1600 : index + %self = struct.new : <@KeccakfRound_88::@KeccakfRound_88<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1600 } : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%5] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%8] = %6 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %7 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %12 = pod.read %pod_2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @Theta_9::@Theta_9::@compute(%12) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %13 : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %9 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %12 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @RhoPi_80::@RhoPi_80::@compute(%14) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %9 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %12 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @Chi_85::@Chi_85::@compute(%14) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %15 : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %9 : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %12 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @Iota_87::@Iota_87::@compute(%14) : (!array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %15 : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c1600 step %c1 { + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@theta$inputs] = %pod_2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Theta_9::@Theta_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@theta] = %0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "compute"} + struct.writem %self[@chi$inputs] = %pod_4 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Chi_85::@Chi_85<[]>>, @params: !pod.type<[]>]>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@chi] = %1 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "compute"} + struct.writem %self[@rhopi$inputs] = %pod_0 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@RhoPi_80::@RhoPi_80<[]>>, @params: !pod.type<[]>]>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@rhopi] = %2 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "compute"} + struct.writem %self[@iota$inputs] = %pod_6 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Iota_87::@Iota_87<[]>>, @params: !pod.type<[]>]>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@iota] = %3 : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>> + } + function.def @constrain(%arg0: !struct.type<@KeccakfRound_88::@KeccakfRound_88<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c1600 = arith.constant 1600 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@rhopi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@RhoPi_80::@RhoPi_80<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@rhopi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@theta] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Theta_9::@Theta_9<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@theta$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@chi] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Chi_85::@Chi_85<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@chi$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@iota] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !struct.type<@Iota_87::@Iota_87<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@iota$inputs] : <@KeccakfRound_88::@KeccakfRound_88<[]>>, !pod.type<[@in: !array.type<1600 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%14] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %3[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %1[@out] : <@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %5[@out] : <@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c1600 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %7[@out] : <@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%17] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Theta_9::@Theta_9::@constrain(%3, %9) : (!struct.type<@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %6[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Chi_85::@Chi_85::@constrain(%5, %10) : (!struct.type<@Chi_85::@Chi_85<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @RhoPi_80::@RhoPi_80::@constrain(%1, %11) : (!struct.type<@RhoPi_80::@RhoPi_80<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %8[@in] : <[@in: !array.type<1600 x !felt.type<"babybear">>]>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Iota_87::@Iota_87::@constrain(%7, %12) : (!struct.type<@Iota_87::@Iota_87<[]>>, !array.type<1600 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/lesseqthan.llzk b/examples/circom-demo/lesseqthan.llzk new file mode 100644 index 0000000..e296e6f --- /dev/null +++ b/examples/circom-demo/lesseqthan.llzk @@ -0,0 +1,348 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@LessEqThan_2::@LessEqThan_2<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<33 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c33 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessEqThan_2 { + struct.def @LessEqThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_2::@LessEqThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@LessEqThan_2::@LessEqThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @LessThan_1::@LessThan_1::@product(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %28 = function.call @LessThan_1::@LessThan_1::@compute(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @LessThan_1::@LessThan_1::@compute(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %12 : <@LessEqThan_2::@LessEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@LessEqThan_2::@LessEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %13 : <@LessEqThan_2::@LessEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@LessEqThan_2::@LessEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %self[@lt] : <@LessEqThan_2::@LessEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@lt$inputs] : <@LessEqThan_2::@LessEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %15[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%15, %25) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessEqThan_2::@LessEqThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_2::@LessEqThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@LessEqThan_2::@LessEqThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %12 : <@LessEqThan_2::@LessEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@LessEqThan_2::@LessEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %13 : <@LessEqThan_2::@LessEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessEqThan_2::@LessEqThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessEqThan_2::@LessEqThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessEqThan_2::@LessEqThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@LessEqThan_2::@LessEqThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@LessEqThan_2::@LessEqThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %11) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/lessthan.llzk b/examples/circom-demo/lessthan.llzk new file mode 100644 index 0000000..db93301 --- /dev/null +++ b/examples/circom-demo/lessthan.llzk @@ -0,0 +1,216 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@LessThan_1::@LessThan_1<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<33 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c33 = arith.constant 33 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c33 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4294967296 = felt.const 4294967296 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_4294967296 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c32] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/main.llzk b/examples/circom-demo/main.llzk new file mode 100644 index 0000000..38eadfe --- /dev/null +++ b/examples/circom-demo/main.llzk @@ -0,0 +1,58 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@fulladder_0::@fulladder_0<[]>>} { + poly.template @fulladder_0 { + struct.def @fulladder_0 { + struct.member @val : !felt.type<"babybear"> {llzk.pub} + struct.member @carry_out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@fulladder_0::@fulladder_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@fulladder_0::@fulladder_0<[]>> {product_source = "compute"} + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.umod %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@val] = %2 : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.uintdiv %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@carry_out] = %5 : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %6 = struct.readm %self[@val] : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %self[@carry_out] : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@fulladder_0::@fulladder_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@fulladder_0::@fulladder_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@fulladder_0::@fulladder_0<[]>> {product_source = "compute"} + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.umod %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@val] = %2 : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.uintdiv %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@carry_out] = %5 : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@fulladder_0::@fulladder_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@fulladder_0::@fulladder_0<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@val] : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@carry_out] : <@fulladder_0::@fulladder_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matAdd_test.llzk b/examples/circom-demo/matAdd_test.llzk new file mode 100644 index 0000000..6a33524 --- /dev/null +++ b/examples/circom-demo/matAdd_test.llzk @@ -0,0 +1,99 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matAdd_0::@matAdd_0<[]>>} { + poly.template @matAdd_0 { + struct.def @matAdd_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matAdd_0::@matAdd_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matAdd_0::@matAdd_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matAdd_0::@matAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg1[%7, %8] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12] = %10 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%14, %15] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg1[%17, %18] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.add %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%21, %22] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@matAdd_0::@matAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@matAdd_0::@matAdd_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matAdd_0::@matAdd_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matAdd_0::@matAdd_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg1[%5, %6] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10] = %8 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matAdd_0::@matAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matAdd_0::@matAdd_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matAdd_0::@matAdd_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !array.type<2,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matAdd_0::@matAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg2[%6, %7] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matElemMul_test.llzk b/examples/circom-demo/matElemMul_test.llzk new file mode 100644 index 0000000..2a18b32 --- /dev/null +++ b/examples/circom-demo/matElemMul_test.llzk @@ -0,0 +1,99 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matElemMul_0::@matElemMul_0<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg1[%7, %8] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12] = %10 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%14, %15] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg1[%17, %18] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%21, %22] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg1[%5, %6] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10] = %8 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !array.type<2,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg2[%6, %7] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matElemPow_test.llzk b/examples/circom-demo/matElemPow_test.llzk new file mode 100644 index 0000000..dd8bcb2 --- /dev/null +++ b/examples/circom-demo/matElemPow_test.llzk @@ -0,0 +1,324 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matElemPow_1::@matElemPow_1<[]>>} { + poly.template @power_0 { + struct.def @power_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @prod : !array.type<5 x !felt.type<"babybear">> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@power_0::@power_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@power_0::@power_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + array.write %nondet[%c0] = %arg0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@prod] : <@power_0::@power_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %2 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet[%7] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.sub %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%13] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %14, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %3 : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@prod] = %nondet : <@power_0::@power_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %4 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@power_0::@power_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@power_0::@power_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@power_0::@power_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + array.write %nondet[%c0] = %arg0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %0 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %0 : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@prod] = %nondet : <@power_0::@power_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@power_0::@power_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@power_0::@power_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@prod] : <@power_0::@power_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %2 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @matElemPow_1 { + struct.def @matElemPow_1 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @pow : !array.type<2,3 x !struct.type<@power_0::@power_0<[]>>> + struct.member @pow$inputs : !array.type<2,3 x !pod.type<[@a: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matElemPow_1::@matElemPow_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@matElemPow_1::@matElemPow_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c1 : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2] = %3 : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%5, %6] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %array_0[%8, %9] : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %10[@a] = %7 : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%11, %12] = %10 : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array[%13, %14] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %26 = pod.read %10[@a] : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = function.call @power_0::@power_0::@product(%26) : (!felt.type<"babybear">) -> !struct.type<@power_0::@power_0<[]>> + %28 = function.call @power_0::@power_0::@compute(%26) : (!felt.type<"babybear">) -> !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + pod.write %15[@comp] = %27 : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + %29 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%29, %30] = %15 : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%19, %20] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@comp] : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + %23 = struct.readm %22[@out] : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24, %25] = %23 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@pow$inputs] = %array_0 : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !pod.type<[@a: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <2,3 x !struct.type<@power_0::@power_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1, %arg2] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2] = %4 : <2,3 x !struct.type<@power_0::@power_0<[]>>>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@pow] = %array_1 : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !struct.type<@power_0::@power_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@pow] : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !struct.type<@power_0::@power_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@pow$inputs] : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !pod.type<[@a: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg0[%5, %6] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %2[%8, %9] : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@a] : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%12, %13] : <2,3 x !struct.type<@power_0::@power_0<[]>>>, !struct.type<@power_0::@power_0<[]>> {product_source = "constrain"} + %15 = struct.readm %14[@out] : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%16, %17] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1, %arg2] : <2,3 x !struct.type<@power_0::@power_0<[]>>>, !struct.type<@power_0::@power_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2] : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @power_0::@power_0::@constrain(%3, %5) : (!struct.type<@power_0::@power_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@matElemPow_1::@matElemPow_1<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matElemPow_1::@matElemPow_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@matElemPow_1::@matElemPow_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2] = %0 : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %array_0[%5, %6] : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %7[@a] = %4 : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%8, %9] = %7 : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%10, %11] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %23 = pod.read %7[@a] : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %24 = function.call @power_0::@power_0::@compute(%23) : (!felt.type<"babybear">) -> !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + pod.write %12[@comp] = %24 : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + %25 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%25, %26] = %12 : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array[%16, %17] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%21, %22] = %20 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@pow$inputs] = %array_0 : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !pod.type<[@a: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <2,3 x !struct.type<@power_0::@power_0<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1, %arg2] : <2,3 x !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@power_0::@power_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2] = %1 : <2,3 x !struct.type<@power_0::@power_0<[]>>>, !struct.type<@power_0::@power_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@pow] = %array_1 : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !struct.type<@power_0::@power_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemPow_1::@matElemPow_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemPow_1::@matElemPow_1<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %0 = struct.readm %arg0[@out] : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@pow] : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !struct.type<@power_0::@power_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@pow$inputs] : <@matElemPow_1::@matElemPow_1<[]>>, !array.type<2,3 x !pod.type<[@a: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%5, %6] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %2[%8, %9] : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@a] : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%12, %13] : <2,3 x !struct.type<@power_0::@power_0<[]>>>, !struct.type<@power_0::@power_0<[]>> {product_source = "constrain"} + %15 = struct.readm %14[@out] : <@power_0::@power_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%16, %17] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2, %arg3] : <2,3 x !struct.type<@power_0::@power_0<[]>>>, !struct.type<@power_0::@power_0<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3] : <2,3 x !pod.type<[@a: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @power_0::@power_0::@constrain(%3, %5) : (!struct.type<@power_0::@power_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matMul_test.llzk b/examples/circom-demo/matMul_test.llzk new file mode 100644 index 0000000..5108d4d --- /dev/null +++ b/examples/circom-demo/matMul_test.llzk @@ -0,0 +1,719 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matMul_2::@matMul_2<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<1,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>, %arg2: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<3 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %9 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%9) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %9 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %11 { + %13 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %nondet[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%c0, %16] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %12 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %12 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %self[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %4[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %9 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%9) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %9 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %11 { + %13 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %4[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c0, %16] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %4[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %8 = array.read %4[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%3) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %1[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %9 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @matMul_2 { + struct.def @matMul_2 { + struct.member @out : !array.type<2,2 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemMulComp : !array.type<2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @matElemMulComp$inputs : !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + struct.member @matElemSumComp : !array.type<2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @matElemSumComp$inputs : !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant {product_source = "compute"} 3 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = array.read %array[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c6 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3] = %5 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = array.read %array_1[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c3 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg2, %arg3] = %5 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%15, %16] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_0[%18, %19] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%c0, %22] = %17 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%23, %24] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %25[@a] = %21 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%26, %27] = %25 : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array[%28, %29] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %30[@count] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %53 = pod.read %25[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %25[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @matElemMul_0::@matElemMul_0::@compute(%53, %54) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %30[@comp] = %55 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %56 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%56, %57] = %30 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg1[%34, %35] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_0[%37, %38] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = pod.read %39[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%c0, %41] = %36 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_0[%42, %43] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %44[@b] = %40 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%45, %46] = %44 : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%47, %48] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %49[@count] = %51 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %44[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %44[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @matElemMul_0::@matElemMul_0::@compute(%53, %54) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %49[@comp] = %55 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %56 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%56, %57] = %49 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array[%15, %16] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %18 = pod.read %17[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%c0, %20] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_2[%22, %23] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %24[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%c0, %26] = %21 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_2[%27, %28] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %29[@a] = %25 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%30, %31] = %29 : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_1[%32, %33] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %38 = pod.read %29[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @matElemSum_1::@matElemSum_1::@product(%38) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %40 = function.call @matElemSum_1::@matElemSum_1::@compute(%38) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %34[@comp] = %39 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%41, %42] = %34 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_1[%7, %8] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13] = %11 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@matElemSumComp$inputs] = %array_2 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = array.read %array_1[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_3[%arg2, %arg3] = %6 : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@matElemSumComp] = %array_3 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@matElemMulComp$inputs] = %array_0 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = array.read %array[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_4[%arg2, %arg3] = %6 : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@matElemMulComp] = %array_4 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@matElemMulComp] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@matElemMulComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %self[@matElemSumComp] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %4 = struct.readm %self[@matElemSumComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%15, %16] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %2[%18, %19] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%c0, %22] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg1[%24, %25] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %2[%27, %28] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %30 = pod.read %29[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%c0, %31] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%15, %16] : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%c0, %19] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %4[%21, %22] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%c0, %25] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %3[%7, %8] : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = array.read %3[%arg2, %arg3] : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %6 = array.read %4[%arg2, %arg3] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%5, %7) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = array.read %1[%arg2, %arg3] : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %6 = array.read %2[%arg2, %arg3] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %6[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@matMul_2::@matMul_2<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant {product_source = "compute"} 3 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c6 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3] = %0 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg2, %arg3] = %0 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%10, %11] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_0[%13, %14] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%c0, %17] = %12 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_0[%18, %19] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %20[@a] = %16 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%21, %22] = %20 : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%23, %24] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %48 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %20[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %50 = function.call @matElemMul_0::@matElemMul_0::@compute(%48, %49) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %25[@comp] = %50 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %51 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%51, %52] = %25 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %arg1[%29, %30] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_0[%32, %33] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = pod.read %34[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %35[%c0, %36] = %31 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_0[%37, %38] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %39[@b] = %35 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%40, %41] = %39 : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %42 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%42, %43] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %39[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %39[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %50 = function.call @matElemMul_0::@matElemMul_0::@compute(%48, %49) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + pod.write %44[@comp] = %50 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %51 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%51, %52] = %44 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%10, %11] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%c0, %15] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_2[%17, %18] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%c0, %21] = %16 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_2[%22, %23] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %24[@a] = %20 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%25, %26] = %24 : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_1[%27, %28] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %24[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @matElemSum_1::@matElemSum_1::@compute(%33) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + pod.write %29[@comp] = %34 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %35 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%35, %36] = %29 : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %array_1[%2, %3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7, %8] = %6 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@matElemSumComp$inputs] = %array_2 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array_1[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + array.write %array_3[%arg2, %arg3] = %1 : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@matElemSumComp] = %array_3 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "compute"} + struct.writem %self[@matElemMulComp$inputs] = %array_0 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg2, %arg3] : <2,2 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + array.write %array_4[%arg2, %arg3] = %1 : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@matElemMulComp] = %array_4 : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matMul_2::@matMul_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_2::@matMul_2<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !array.type<3,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %0 = struct.readm %arg0[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@matElemMulComp] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@matElemSumComp] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%15, %16] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %2[%18, %19] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%c0, %22] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg2[%24, %25] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %2[%27, %28] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %30 = pod.read %29[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%c0, %31] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%15, %16] : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%c0, %19] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %4[%21, %22] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%c0, %25] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %3[%7, %8] : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = array.read %3[%arg3, %arg4] : <2,2 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> {product_source = "constrain"} + %6 = array.read %4[%arg3, %arg4] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_1::@matElemSum_1::@constrain(%5, %7) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = array.read %1[%arg3, %arg4] : <2,2 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> {product_source = "constrain"} + %6 = array.read %2[%arg3, %arg4] : <2,2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %6[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemMul_0::@matElemMul_0::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matPow_test.llzk b/examples/circom-demo/matPow_test.llzk new file mode 100644 index 0000000..4d4f237 --- /dev/null +++ b/examples/circom-demo/matPow_test.llzk @@ -0,0 +1,976 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matPow_3::@matPow_3<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<1,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>, %arg2: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<3 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_2 { + struct.def @matMul_2 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemMulComp : !array.type<3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @matElemMulComp$inputs : !array.type<3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + struct.member @matElemSumComp : !array.type<3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @matElemSumComp$inputs : !array.type<3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@matMul_2::@matMul_2<[]>> + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> + %array = array.new : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg2, %arg3] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c6 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2, %arg3] = %0 : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + %array_0 = array.new : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array_1[%arg2, %arg3] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg2, %arg3] = %0 : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + %array_2 = array.new : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %10 = cast.toindex %0 : !felt.type<"babybear"> + %11 = cast.toindex %9 : !felt.type<"babybear"> + %12 = array.read %arg0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %array_0[%13, %14] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %12 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %0 : !felt.type<"babybear"> + %19 = cast.toindex %1 : !felt.type<"babybear"> + %20 = array.read %array_0[%18, %19] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %20[@a] = %16 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_0[%21, %22] = %20 : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %array[%23, %24] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.subi %26, %c1 : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.cmpi eq, %27, %c0 : index + scf.if %28 { + %48 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %49 = pod.read %20[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %50 = function.call @matElemMul_0::@matElemMul_0::@compute(%48, %49) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %25[@comp] = %50 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array[%51, %52] = %25 : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = array.read %arg1[%29, %30] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + %33 = cast.toindex %1 : !felt.type<"babybear"> + %34 = array.read %array_0[%32, %33] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %35 = pod.read %34[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %36 = cast.toindex %9 : !felt.type<"babybear"> + array.write %35[%c0, %36] = %31 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = array.read %array_0[%37, %38] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %39[@b] = %35 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %40 = cast.toindex %0 : !felt.type<"babybear"> + %41 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_0[%40, %41] = %39 : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %42 = cast.toindex %0 : !felt.type<"babybear"> + %43 = cast.toindex %1 : !felt.type<"babybear"> + %44 = array.read %array[%42, %43] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %46 = arith.subi %45, %c1 : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %47 = arith.cmpi eq, %46, %c0 : index + scf.if %47 { + %48 = pod.read %39[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %49 = pod.read %39[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %50 = function.call @matElemMul_0::@matElemMul_0::@compute(%48, %49) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %44[@comp] = %50 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array[%51, %52] = %44 : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %10 = cast.toindex %0 : !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + %12 = array.read %array[%10, %11] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %14 = struct.readm %13[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %14[%c0, %15] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = cast.toindex %1 : !felt.type<"babybear"> + %19 = array.read %array_2[%17, %18] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %20 = pod.read %19[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %21 = cast.toindex %9 : !felt.type<"babybear"> + array.write %20[%c0, %21] = %16 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = array.read %array_2[%22, %23] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %24[@a] = %20 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_2[%25, %26] = %24 : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %27 = cast.toindex %0 : !felt.type<"babybear"> + %28 = cast.toindex %1 : !felt.type<"babybear"> + %29 = array.read %array_1[%27, %28] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %24[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %34 = function.call @matElemSum_1::@matElemSum_1::@compute(%33) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %29[@comp] = %34 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %35 = cast.toindex %0 : !felt.type<"babybear"> + %36 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_1[%35, %36] = %29 : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %array_1[%2, %3] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %6 = struct.readm %5[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %0 : !felt.type<"babybear"> + %8 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%7, %8] = %6 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@matElemSumComp$inputs] = %array_2 : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array_1[%arg2, %arg3] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_3[%arg2, %arg3] = %1 : <3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + struct.writem %self[@matElemSumComp] = %array_3 : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@matElemMulComp$inputs] = %array_0 : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_4 = array.new : <3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + scf.for %arg3 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg2, %arg3] : <3,3 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_4[%arg2, %arg3] = %1 : <3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + struct.writem %self[@matElemMulComp] = %array_4 : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_2::@matMul_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_2::@matMul_2<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c3 = arith.constant 3 : index + %0 = struct.readm %arg0[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemMulComp] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %2 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemSumComp] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %4 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %15 = cast.toindex %5 : !felt.type<"babybear"> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %arg1[%15, %16] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %5 : !felt.type<"babybear"> + %19 = cast.toindex %6 : !felt.type<"babybear"> + %20 = array.read %2[%18, %19] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %22 = cast.toindex %14 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = cast.toindex %6 : !felt.type<"babybear"> + %26 = array.read %arg2[%24, %25] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = cast.toindex %5 : !felt.type<"babybear"> + %28 = cast.toindex %6 : !felt.type<"babybear"> + %29 = array.read %2[%27, %28] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %30 = pod.read %29[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %31 = cast.toindex %14 : !felt.type<"babybear"> + %32 = array.read %30[%c0, %31] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg5 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %15 = cast.toindex %5 : !felt.type<"babybear"> + %16 = cast.toindex %6 : !felt.type<"babybear"> + %17 = array.read %1[%15, %16] : <3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%c0, %19] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %5 : !felt.type<"babybear"> + %22 = cast.toindex %6 : !felt.type<"babybear"> + %23 = array.read %4[%21, %22] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %24 = pod.read %23[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %25 = cast.toindex %14 : !felt.type<"babybear"> + %26 = array.read %24[%c0, %25] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = cast.toindex %5 : !felt.type<"babybear"> + %8 = cast.toindex %6 : !felt.type<"babybear"> + %9 = array.read %3[%7, %8] : <3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %10 = struct.readm %9[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = cast.toindex %6 : !felt.type<"babybear"> + %13 = array.read %0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = array.read %3[%arg3, %arg4] : <3,3 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %6 = array.read %4[%arg3, %arg4] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%5, %7) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () + } + } + scf.for %arg3 = %c0 to %c3 step %c1 { + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = array.read %1[%arg3, %arg4] : <3,3 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %6 = array.read %2[%arg3, %arg4] : <3,3 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> () + } + } + function.return + } + } + } + poly.template @matPow_3 { + struct.def @matPow_3 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + struct.member @comp : !array.type<3 x !struct.type<@matMul_2::@matMul_2<[]>>> + struct.member @comp$inputs : !array.type<3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matPow_3::@matPow_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c18 = arith.constant {product_source = "compute"} 18 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@matPow_3::@matPow_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c18 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %3 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10, %11] = %7 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %12[@a] = %9 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %12 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %13[@count] = %15 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %18 = pod.read %12[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %12[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @matMul_2::@matMul_2::@compute(%18, %19) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %13[@comp] = %20 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %13 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %17 = bool.cmp eq(%3, %4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %17 { + %18 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %18[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20, %21] = %felt_const_1 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@b] = %19 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %22 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %23[@count] = %25 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %22[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @matMul_2::@matMul_2::@compute(%27, %28) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %23[@comp] = %29 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %23 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %18 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %18[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20, %21] = %felt_const_0 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@b] = %19 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %22 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %23[@count] = %25 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %22[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @matMul_2::@matMul_2::@compute(%27, %28) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %23[@comp] = %29 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %23 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array[%7] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %10[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_0[%14] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_0[%19] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %20[@a] = %16 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%21] = %20 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array[%22] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %23[@count] = %25 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %43 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %20[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @matMul_2::@matMul_2::@compute(%43, %44) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %23[@comp] = %45 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46] = %23 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %27 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg0[%27, %28] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_0[%30] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %31[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %32[%33, %34] = %29 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array_0[%35] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %36[@b] = %32 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37] = %36 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %38 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%38] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %36[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %36[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @matMul_2::@matMul_2::@compute(%43, %44) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %39[@comp] = %45 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %46 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46] = %39 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %7[%8, %9] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12] = %10 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@comp$inputs] = %array_0 : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %4 : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@comp] = %array_1 : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matPow_3::@matPow_3<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matPow_3::@matPow_3<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg0[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %2[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %9[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = bool.cmp eq(%3, %4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %13 { + %14 = array.read %2[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %15[%16, %17] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %14 = array.read %2[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %15[%16, %17] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %9 = struct.readm %8[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %9[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %2[%13] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %15[%16, %17] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg0[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %24[%25, %26] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%c2] : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %6[%7, %8] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg1] : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matMul_2::@matMul_2::@constrain(%3, %5, %6) : (!struct.type<@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@matPow_3::@matPow_3<[]>> + } + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matPow_3::@matPow_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c18 = arith.constant {product_source = "compute"} 18 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@matPow_3::@matPow_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %0 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %5[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7, %8] = %4 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@a] = %6 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %9 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %15 = pod.read %9[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %9[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %17 = function.call @matMul_2::@matMul_2::@compute(%15, %16) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %10[@comp] = %17 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %10 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %14 = bool.cmp eq(%0, %1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %14 { + %15 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18] = %felt_const_1 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %19[@b] = %16 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %19 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %19[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %19[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @matMul_2::@matMul_2::@compute(%24, %25) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %20[@comp] = %26 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %20 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %15 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %15[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18] = %felt_const_0 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %19[@b] = %16 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %array_0[%c0] = %19 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %19[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %19[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @matMul_2::@matMul_2::@compute(%24, %25) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %20[@comp] = %26 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %20 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%4] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %7[%8, %9] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%11] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %12[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14, %15] = %10 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_0[%16] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %17[@a] = %13 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%18] = %17 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%19] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %40 = pod.read %17[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %17[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @matMul_2::@matMul_2::@compute(%40, %41) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %20[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%43] = %20 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%24, %25] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%27] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %26 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%32] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %33[@b] = %29 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34] = %33 : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array[%35] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.subi %37, %c1 {product_source = "compute"} : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.cmpi eq, %38, %c0 {product_source = "compute"} : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %33[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @matMul_2::@matMul_2::@compute(%40, %41) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %43 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%43] = %36 : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %4[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8, %9] = %7 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@comp$inputs] = %array_0 : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <3 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %0 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %1 : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@comp] = %array_1 : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matPow_3::@matPow_3<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matPow_3::@matPow_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@matPow_3::@matPow_3<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matPow_3::@matPow_3<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !struct.type<@matMul_2::@matMul_2<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@matPow_3::@matPow_3<[]>>, !array.type<3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %2[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %9[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = bool.cmp eq(%3, %4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %13 { + %14 = array.read %2[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %15[%16, %17] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %14 = array.read %2[%c0] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %15[%16, %17] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %9 = struct.readm %8[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %9[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %2[%13] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %15[%16, %17] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %24[%25, %26] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %1[%c2] : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %6 = struct.readm %5[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %6[%7, %8] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = array.read %1[%arg2] : <3 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <3 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matMul_2::@matMul_2::@constrain(%3, %5, %6) : (!struct.type<@matMul_2::@matMul_2<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matScalarAdd_test.llzk b/examples/circom-demo/matScalarAdd_test.llzk new file mode 100644 index 0000000..a1b9373 --- /dev/null +++ b/examples/circom-demo/matScalarAdd_test.llzk @@ -0,0 +1,87 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matScalarAdd_0::@matScalarAdd_0<[]>>} { + poly.template @matScalarAdd_0 { + struct.def @matScalarAdd_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@matScalarAdd_0::@matScalarAdd_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matScalarAdd_0::@matScalarAdd_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matScalarAdd_0::@matScalarAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8, %9] = %7 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%11, %12] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %13, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%15, %16] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@matScalarAdd_0::@matScalarAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@matScalarAdd_0::@matScalarAdd_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@matScalarAdd_0::@matScalarAdd_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matScalarAdd_0::@matScalarAdd_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %4, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6, %7] = %5 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matScalarAdd_0::@matScalarAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matScalarAdd_0::@matScalarAdd_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matScalarAdd_0::@matScalarAdd_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matScalarAdd_0::@matScalarAdd_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%7, %8] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matScalarMul_test.llzk b/examples/circom-demo/matScalarMul_test.llzk new file mode 100644 index 0000000..0c93a3e --- /dev/null +++ b/examples/circom-demo/matScalarMul_test.llzk @@ -0,0 +1,87 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matScalarMul_0::@matScalarMul_0<[]>>} { + poly.template @matScalarMul_0 { + struct.def @matScalarMul_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@matScalarMul_0::@matScalarMul_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matScalarMul_0::@matScalarMul_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matScalarMul_0::@matScalarMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8, %9] = %7 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%11, %12] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %13, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%15, %16] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@matScalarMul_0::@matScalarMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@matScalarMul_0::@matScalarMul_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@matScalarMul_0::@matScalarMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matScalarMul_0::@matScalarMul_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6, %7] = %5 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matScalarMul_0::@matScalarMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matScalarMul_0::@matScalarMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matScalarMul_0::@matScalarMul_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matScalarMul_0::@matScalarMul_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.mul %5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%7, %8] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matScalarSub_test.llzk b/examples/circom-demo/matScalarSub_test.llzk new file mode 100644 index 0000000..35e4c6a --- /dev/null +++ b/examples/circom-demo/matScalarSub_test.llzk @@ -0,0 +1,87 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matScalarSub_0::@matScalarSub_0<[]>>} { + poly.template @matScalarSub_0 { + struct.def @matScalarSub_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@matScalarSub_0::@matScalarSub_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matScalarSub_0::@matScalarSub_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matScalarSub_0::@matScalarSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.sub %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8, %9] = %7 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%11, %12] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %13, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%15, %16] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@matScalarSub_0::@matScalarSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@matScalarSub_0::@matScalarSub_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@matScalarSub_0::@matScalarSub_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matScalarSub_0::@matScalarSub_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %4, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6, %7] = %5 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matScalarSub_0::@matScalarSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matScalarSub_0::@matScalarSub_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matScalarSub_0::@matScalarSub_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matScalarSub_0::@matScalarSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%7, %8] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/matSub_test.llzk b/examples/circom-demo/matSub_test.llzk new file mode 100644 index 0000000..8422a7e --- /dev/null +++ b/examples/circom-demo/matSub_test.llzk @@ -0,0 +1,99 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@matSub_0::@matSub_0<[]>>} { + poly.template @matSub_0 { + struct.def @matSub_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matSub_0::@matSub_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matSub_0::@matSub_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@matSub_0::@matSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg1[%7, %8] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12] = %10 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%14, %15] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg1[%17, %18] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%21, %22] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@matSub_0::@matSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@matSub_0::@matSub_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@matSub_0::@matSub_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matSub_0::@matSub_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg1[%5, %6] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10] = %8 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@matSub_0::@matSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matSub_0::@matSub_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matSub_0::@matSub_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>, %arg2: !array.type<2,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matSub_0::@matSub_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg2[%6, %7] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.sub %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mimc_sponge_hash_test.llzk b/examples/circom-demo/mimc_sponge_hash_test.llzk new file mode 100644 index 0000000..55b61d1 --- /dev/null +++ b/examples/circom-demo/mimc_sponge_hash_test.llzk @@ -0,0 +1,2583 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MiMCSponge_1::@MiMCSponge_1<[]>>} { + poly.template @MiMCFeistel_0 { + struct.def @MiMCFeistel_0 { + struct.member @xLout : !felt.type<"babybear"> {llzk.pub} + struct.member @xRout : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<220 x !felt.type<"babybear">> + struct.member @t4 : !array.type<220 x !felt.type<"babybear">> + struct.member @xL : !array.type<219 x !felt.type<"babybear">> + struct.member @xR : !array.type<219 x !felt.type<"babybear">> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c220 = arith.constant 220 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_219 = felt.const 219 : <"babybear"> + %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 = felt.const 2119542016932434047340813757208803962484943912710204325088879681995922344971 : <"babybear"> + %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 = felt.const 11050822248291117548220126630860474473945266276626263036056336623671308219529 : <"babybear"> + %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 = felt.const 274945154732293792784580363548970818611304339008964723447672490026510689427 : <"babybear"> + %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 = felt.const 18224457394066545825553407391290108485121649197258948320896164404518684305122 : <"babybear"> + %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 = felt.const 14227467863135365427954093998621993651369686288941275436795622973781503444257 : <"babybear"> + %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 = felt.const 16085392195894691829567913404182676871326863890140775376809129785155092531260 : <"babybear"> + %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 = felt.const 5628039096440332922248578319648483863204530861778160259559031331287721255522 : <"babybear"> + %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 = felt.const 15162538063742142685306302282127534305212832649282186184583465569986719234456 : <"babybear"> + %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 = felt.const 2273205422216987330510475127669563545720586464429614439716564154166712854048 : <"babybear"> + %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 = felt.const 7400481189785154329569470986896455371037813715804007747228648863919991399081 : <"babybear"> + %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 = felt.const 16641596134749940573104316021365063031319260205559553673368334842484345864859 : <"babybear"> + %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 = felt.const 17297554111853491139852678417579991271009602631577069694853813331124433680030 : <"babybear"> + %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 = felt.const 6936272626871035740815028148058841877090860312517423346335878088297448888663 : <"babybear"> + %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 = felt.const 12732823292801537626009139514048596316076834307941224506504666470961250728055 : <"babybear"> + %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 = felt.const 6842203153996907264167856337497139692895299874139131328642472698663046726780 : <"babybear"> + %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 = felt.const 15117544653571553820496948522381772148324367479772362833334593000535648316185 : <"babybear"> + %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 = felt.const 6479667912792222539919362076122453947926362746906450079329453150607427372979 : <"babybear"> + %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 = felt.const 10702811721859145441471328511968332847175733707711670171718794132331147396634 : <"babybear"> + %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 = felt.const 12216779172735125538689875667307129262237123728082657485828359100719208190116 : <"babybear"> + %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 = felt.const 9244680976345080074252591214216060854998619670381671198295645618515047080988 : <"babybear"> + %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 = felt.const 8242601581342441750402731523736202888792436665415852106196418942315563860366 : <"babybear"> + %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 = felt.const 14016139747289624978792446847000951708158212463304817001882956166752906714332 : <"babybear"> + %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 = felt.const 17566185590731088197064706533119299946752127014428399631467913813769853431107 : <"babybear"> + %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 = felt.const 10814026414212439999107945133852431304483604215416531759535467355316227331774 : <"babybear"> + %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 = felt.const 11498264615058604317482574216318586415670903094838791165247179252175768794889 : <"babybear"> + %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 = felt.const 18664315914479294273286016871365663486061896605232511201418576829062292269769 : <"babybear"> + %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 = felt.const 19212515502973904821995111796203064175854996071497099383090983975618035391558 : <"babybear"> + %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 = felt.const 6614652990340435611114076169697104582524566019034036680161902142028967568142 : <"babybear"> + %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 = felt.const 8653175945487997845203439345797943132543211416447757110963967501177317426221 : <"babybear"> + %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 = felt.const 3819598418157732134449049289585680301176983019643974929528867686268702720163 : <"babybear"> + %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 = felt.const 1258781501221760320019859066036073675029057285507345332959539295621677296991 : <"babybear"> + %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 = felt.const 21578580340755653236050830649990190843552802306886938815497471545814130084980 : <"babybear"> + %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 = felt.const 15092262360719700162343163278648422751610766427236295023221516498310468956361 : <"babybear"> + %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 = felt.const 2929658084700714257515872921366736697080475676508114973627124569375444665664 : <"babybear"> + %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 = felt.const 19914849528178967155534624144358541535306360577227460456855821557421213606310 : <"babybear"> + %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 = felt.const 17047263688548829001253658727764731047114098556534482052135734487985276987385 : <"babybear"> + %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 = felt.const 19187314764836593118404597958543112407224947638377479622725713735224279297009 : <"babybear"> + %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 = felt.const 11028094245762332275225364962905938096659249161369092798505554939952525894293 : <"babybear"> + %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 = felt.const 5542499997310181530432302492142574333860449305424174466698068685590909336771 : <"babybear"> + %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 = felt.const 1205448543652932944633962232545707633928124666868453915721030884663332604536 : <"babybear"> + %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 = felt.const 5300440870136391278944213332144327695659161151625757537632832724102670898756 : <"babybear"> + %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 = felt.const 8777887112076272395250620301071581171386440850451972412060638225741125310886 : <"babybear"> + %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 = felt.const 5100105771517691442278432864090229416166996183792075307747582375962855820797 : <"babybear"> + %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 = felt.const 20871081766843466343749609089986071784031203517506781251203251608363835140622 : <"babybear"> + %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 = felt.const 19871836214837460419845806980869387567383718044439891735114283113359312279540 : <"babybear"> + %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 = felt.const 10796631184889302076168355684722130903785890709107732067446714470783437829037 : <"babybear"> + %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 = felt.const 6506225705710197163670556961299945987488979904603689017479840649664564978574 : <"babybear"> + %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 = felt.const 15016165746156232864069722572047169071786333815661109750860165034341572904221 : <"babybear"> + %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 = felt.const 15550788416669474113213749561488122552422887538676036667630838378023479382689 : <"babybear"> + %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 = felt.const 9783723818270121678386992630754842961728702994964214799008457449989291229500 : <"babybear"> + %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 = felt.const 19012287860122586147374214541764572282814469237161122489573881644994964647218 : <"babybear"> + %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 = felt.const 9558393272910366944245875920138649617479779893610128634419086981339060613250 : <"babybear"> + %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 = felt.const 8673089750662709235894359384294076697329948991010184356091130382437645649279 : <"babybear"> + %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 = felt.const 10493603554686607050979497281838644324893776154179810893893660722522945589063 : <"babybear"> + %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 = felt.const 9277135875276787021836189566799935097400042171346561246305113339462708861695 : <"babybear"> + %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 = felt.const 6252650284989960032925831409804233477770646333900692286731621844532438095656 : <"babybear"> + %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 = felt.const 16101132301514338989512946061786320637179843435886825102406248183507106312877 : <"babybear"> + %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 = felt.const 2494806857395134874309386694756263421445039103814920780777601708371037591569 : <"babybear"> + %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 = felt.const 12368712287081330853637674140264759478736012797026621876924395982504369598764 : <"babybear"> + %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 = felt.const 814913922521637742587885320797606426167962526342166512693085292151314976633 : <"babybear"> + %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 = felt.const 438123800976401478772659663183448617575635636575786782566035096946820525816 : <"babybear"> + %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 = felt.const 7733050956302327984762132317027414325566202380840692458138724610131603812560 : <"babybear"> + %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 = felt.const 15895485136902450169492923978042129726601461603404514670348703312850236146328 : <"babybear"> + %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 = felt.const 21280039024501430842616328642522421302481259067470872421086939673482530783142 : <"babybear"> + %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 = felt.const 3667030990325966886479548860429670833692690972701471494757671819017808678584 : <"babybear"> + %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 = felt.const 16690275395485630428127725067513114066329712673106153451801968992299636791385 : <"babybear"> + %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 = felt.const 14222898219492484180162096141564251903058269177856173968147960855133048449557 : <"babybear"> + %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 = felt.const 15566927854306879444693061574322104423426072650522411176731130806720753591030 : <"babybear"> + %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 = felt.const 11272653598912269895509621181205395118899451234151664604248382803490621227687 : <"babybear"> + %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 = felt.const 397690828254561723549349897112473766901585444153303054845160673059519614409 : <"babybear"> + %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 = felt.const 16143265650645676880461646123844627780378251900510645261875867423498913438066 : <"babybear"> + %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 = felt.const 4947482739415078212217504789923078546034438919537985740403824517728200332286 : <"babybear"> + %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 = felt.const 5894928453677122829055071981254202951712129328678534592916926069506935491729 : <"babybear"> + %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 = felt.const 16062117410185840274616925297332331018523844434907012275592638570193234893570 : <"babybear"> + %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 = felt.const 2204224910006646535594933495262085193210692406133533679934843341237521233504 : <"babybear"> + %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 = felt.const 2492729278659146790410698334997955258248120870028541691998279257260289595548 : <"babybear"> + %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 = felt.const 146494141603558321291767829522948454429758543710648402457451799015963102253 : <"babybear"> + %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 = felt.const 16901065971871379877929280081392692752968612240624985552337779093292740763381 : <"babybear"> + %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 = felt.const 18230936781133176044598070768084230333433368654744509969087239465125979720995 : <"babybear"> + %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 = felt.const 10780807212297131186617505517708903709488273075252405602261683478333331220733 : <"babybear"> + %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 = felt.const 19171031072692942278056619599721228021635671304612437350119663236604712493093 : <"babybear"> + %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 = felt.const 2825393571154632139467378429077438870179957021959813965940638905853993971879 : <"babybear"> + %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 = felt.const 4221265384902749246920810956363310125115516771964522748896154428740238579824 : <"babybear"> + %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 = felt.const 1888195070251580606973417065636430294417895423429240431595054184472931224452 : <"babybear"> + %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 = felt.const 1022951765127126818581466247360193856197472064872288389992480993218645055345 : <"babybear"> + %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 = felt.const 8677548159358013363291014307402600830078662555833653517843708051504582990832 : <"babybear"> + %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 = felt.const 4467191506765339364971058668792642195242197133011672559453028147641428433293 : <"babybear"> + %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 = felt.const 16729368143229828574342820060716366330476985824952922184463387490091156065099 : <"babybear"> + %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 = felt.const 21297149835078365363970699581821844234354988617890041296044775371855432973500 : <"babybear"> + %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 = felt.const 10090204501612803176317709245679152331057882187411777688746797044706063410969 : <"babybear"> + %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 = felt.const 248732676202643792226973868626360612151424823368345645514532870586234380100 : <"babybear"> + %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 = felt.const 3506345610354615013737144848471391553141006285964325596214723571988011984829 : <"babybear"> + %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 = felt.const 18364168158495573675698600238443218434246806358811328083953887470513967121206 : <"babybear"> + %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 = felt.const 4993662582188632374202316265508850988596880036291765531885657575099537176757 : <"babybear"> + %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 = felt.const 6678298831065390834922566306988418588227382406175769592902974103663687992230 : <"babybear"> + %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 = felt.const 10761027113757988230637066281488532903174559953630210849190212601991063767647 : <"babybear"> + %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 = felt.const 21171984405852590343970239018692870799717057961108910523876770029017785940991 : <"babybear"> + %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 = felt.const 21345603324471810861925019445720576814602636473739003852898308205213912255830 : <"babybear"> + %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 = felt.const 8465768840047024550750516678171433288207841931251654898809033371655109266663 : <"babybear"> + %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 = felt.const 16395063164993626722686882727042150241125309409717445381854913964674649318585 : <"babybear"> + %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 = felt.const 13973538843621261113924259058427434053808430378163734641175100160836376897004 : <"babybear"> + %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 = felt.const 14595204575654316237672764823862241845410365278802914304953002937313300553572 : <"babybear"> + %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 = felt.const 5027602491523497423798779154966735896562099398367163998686335127580757861872 : <"babybear"> + %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 = felt.const 792781492853909872425531014397300057232399608769451037135936617996830018501 : <"babybear"> + %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 = felt.const 20977948360215259915441258687649465618185769343138135384346964466965010873779 : <"babybear"> + %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 = felt.const 11311085442652291634822798307831431035776248927202286895207125867542470350078 : <"babybear"> + %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 = felt.const 6574066859860991369704567902211886840188702386542112593710271426704432301235 : <"babybear"> + %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 = felt.const 11246573086260753259993971254725613211193686683988426513880826148090811891866 : <"babybear"> + %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 = felt.const 10142447197759703415402259672441315777933858467700579946665223821199077641122 : <"babybear"> + %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 = felt.const 15487549757142039139328911515400805508248576685795694919457041092150651939253 : <"babybear"> + %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 = felt.const 18192064100315141084242006659317257023098826945893371479835220462302399655674 : <"babybear"> + %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 = felt.const 214219368547551689972421167733597094823289857206402800635962137077096090722 : <"babybear"> + %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 = felt.const 2391801327305361293476178683853802679507598622000359948432171562543560193350 : <"babybear"> + %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 = felt.const 4365864398105436789177703571412645548020537580493599380018290523813331678900 : <"babybear"> + %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 = felt.const 3981753758468103976812813304477670033098707002886030847251581853700311567551 : <"babybear"> + %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 = felt.const 10041051776251223165849354194892664881051125330236567356945669006147134614302 : <"babybear"> + %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 = felt.const 1571520786233540988201616650622796363168031165456869481368085474420849243232 : <"babybear"> + %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 = felt.const 17467794879902895769410571945152708684493991588672014763135370927880883292655 : <"babybear"> + %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 = felt.const 2821730726367472966906149684046356272806484545281639696873240305052362149654 : <"babybear"> + %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 = felt.const 11061717085931490100602849654034280576915102867237101935487893025907907250695 : <"babybear"> + %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 = felt.const 16709604795697901641948603019242067672006293290826991671766611326262532802914 : <"babybear"> + %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 = felt.const 3804047064713122820157099453648459188816376755739202017447862327783289895072 : <"babybear"> + %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 = felt.const 18787428285295558781869865751953016580493190547148386433580291216673009884554 : <"babybear"> + %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 = felt.const 14740327483193277147065845135561988641238516852487657117813536909482068950652 : <"babybear"> + %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 = felt.const 14731806221235869882801331463708736361296174006732553130708107037190460654379 : <"babybear"> + %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 = felt.const 2026733759645519472558796412979210009170379159866522399881566309631434814953 : <"babybear"> + %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 = felt.const 10484856914279112612610993418405543310546746652738541161791501150994088679557 : <"babybear"> + %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 = felt.const 32883284540320451295484135704808083452381176816565850047310272290579727564 : <"babybear"> + %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 = felt.const 2511432546938591792036639990606464315121646668029252285288323664350666551637 : <"babybear"> + %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 = felt.const 5007518659266430200134478928344522649876467369278722765097865662497773767152 : <"babybear"> + %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 = felt.const 1153669123397255702524721206511185557982017410156956216465120456256288427021 : <"babybear"> + %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 = felt.const 10810123816265612772922113403831964815724109728287572256602010709288980656498 : <"babybear"> + %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 = felt.const 1813584943682214789802230765734821149202472893379265320098816901270224589984 : <"babybear"> + %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 = felt.const 4923772847693564777744725640710197015181591950368494148029046443433103381621 : <"babybear"> + %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 = felt.const 21815578223768330433802113452339488275704145896544481092014911825656390567514 : <"babybear"> + %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 = felt.const 2016095394399807253596787752134573207202567875457560571095586743878953450738 : <"babybear"> + %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 = felt.const 10868453624107875516866146499877130701929063632959660262366632833504750028858 : <"babybear"> + %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 = felt.const 12200212977482648306758992405065921724409841940671166017620928947866825250857 : <"babybear"> + %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 = felt.const 176061952957067086877570020242717222844908281373122372938833890096257042779 : <"babybear"> + %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 = felt.const 8756385288462344550200229174435953103162307705310807828651304665320046782583 : <"babybear"> + %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 = felt.const 9607550223176946388146938069307456967842408600269548190739947540821716354749 : <"babybear"> + %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 = felt.const 11332046574800279729678603488745295198038913503395629790213378101166488244657 : <"babybear"> + %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 = felt.const 12771414330193951156383998390424063470766226667986423961689712557338777174205 : <"babybear"> + %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 = felt.const 18824274411769830274877839365728651108434404855803844568234862945613766611460 : <"babybear"> + %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 = felt.const 19001050671757720352890779127693793630251266879994702723636759889378387053056 : <"babybear"> + %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 = felt.const 148317947440800089795933930720822493695520852448386394775371401743494965187 : <"babybear"> + %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 = felt.const 7132325028834551397904855671244375895110341505383911719294705267624034122405 : <"babybear"> + %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 = felt.const 18725396114211370207078434315900726338547621160475533496863298091023511945076 : <"babybear"> + %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 = felt.const 16533189939837087893364000390641148516479148564190420358849587959161226782982 : <"babybear"> + %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 = felt.const 17784386835392322654196171115293700800825771210400152504776806618892170162248 : <"babybear"> + %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 = felt.const 10394369641533736715250242399198097296122982486516256408681925424076248952280 : <"babybear"> + %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 = felt.const 17213012626801210615058753489149961717422101711567228037597150941152495100640 : <"babybear"> + %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 = felt.const 8327443473179334761744301768309008451162322941906921742120510244986704677004 : <"babybear"> + %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 = felt.const 168282396747788514908709091757591226095443902501365500003618183905496160435 : <"babybear"> + %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 = felt.const 16390754464333401712265575949874369157699293840516802426621216808905079127650 : <"babybear"> + %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 = felt.const 8959562060028569701043973060670353733575345393653685776974948916988033453971 : <"babybear"> + %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 = felt.const 15618589556584434434009868216186115416835494805174158488636000580759692174228 : <"babybear"> + %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 = felt.const 916941639326869583414469202910306428966657806899788970948781207501251816730 : <"babybear"> + %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 = felt.const 13162342403579303950549728848130828093497701266240457479693991108217307949435 : <"babybear"> + %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 = felt.const 5363660674689121676875069134269386492382220935599781121306637800261912519729 : <"babybear"> + %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 = felt.const 12855514863299373699594410385788943772765811961581749194183533625311486462501 : <"babybear"> + %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 = felt.const 8837549193990558762776520822018694066937602576881497343584903902880277769302 : <"babybear"> + %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 = felt.const 5543749482491340532547407723464609328207990784853381797689466144924198391839 : <"babybear"> + %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 = felt.const 11760570435432189127645691249600821064883781677693087773459065574359292849137 : <"babybear"> + %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 = felt.const 2246692432011290582160062129070762007374502637007107318105405626910313810224 : <"babybear"> + %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 = felt.const 5203908808704813498389265425172875593837960384349653691918590736979872578408 : <"babybear"> + %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 = felt.const 6545064306297957002139416752334741502722251869537551068239642131448768236585 : <"babybear"> + %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 = felt.const 3113973447392053821824427670386252797811804954746053461397972968381571297505 : <"babybear"> + %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 = felt.const 11501810868606870391127866188394535330696206817602260610801897042898616817272 : <"babybear"> + %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 = felt.const 19346204940546791021518535594447257347218878114049998691060016493806845179755 : <"babybear"> + %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 = felt.const 7642160509228669138628515458941659189680509753651629476399516332224325757132 : <"babybear"> + %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 = felt.const 17198004293191777441573635123110935015228014028618868252989374962722329283022 : <"babybear"> + %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 = felt.const 3180973917010545328313139835982464870638521890385603025657430208141494469656 : <"babybear"> + %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 = felt.const 20196970640587451358539129330170636295243141659030208529338914906436009086943 : <"babybear"> + %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 = felt.const 153011722355526826233082383360057587249818749719433916258246100068258954737 : <"babybear"> + %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 = felt.const 2832093654883670345969792724123161241696170611611744759675180839473215203706 : <"babybear"> + %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 = felt.const 10165780782761211520836029617746977303303335603838343292431760011576528327409 : <"babybear"> + %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 = felt.const 20241898894740093733047052816576694435372877719072347814065227797906130857593 : <"babybear"> + %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 = felt.const 10858157235265583624235850660462324469799552996870780238992046963007491306222 : <"babybear"> + %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 = felt.const 6745410632962119604799318394592010194450845483518862700079921360015766217097 : <"babybear"> + %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 = felt.const 6302388219880227251325608388535181451187131054211388356563634768253301290116 : <"babybear"> + %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 = felt.const 1720059427972723034107765345743336447947522473310069975142483982753181038321 : <"babybear"> + %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 = felt.const 10097732913112662248360143041019433907849917041759137293018029019134392559350 : <"babybear"> + %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 = felt.const 4144769320246558352780591737261172907511489963810975650573703217887429086546 : <"babybear"> + %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 = felt.const 5521922218264623411380547905210139511350706092570900075727555783240701821773 : <"babybear"> + %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 = felt.const 19669450123472657781282985229369348220906547335081730205028099210442632534079 : <"babybear"> + %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 = felt.const 15189693413320228845990326214136820307649565437237093707846682797649429515840 : <"babybear"> + %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 = felt.const 18875020877782404439294079398043479420415331640996249745272087358069018086569 : <"babybear"> + %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 = felt.const 148924106504065664829055598316821983869409581623245780505601526786791681102 : <"babybear"> + %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 = felt.const 1888098689545151571063267806606510032698677328923740058080630641742325067877 : <"babybear"> + %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 = felt.const 2436445725746972287496138382764643208791713986676129260589667864467010129482 : <"babybear"> + %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 = felt.const 11878652861183667748838188993669912629573713271883125458838494308957689090959 : <"babybear"> + %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 = felt.const 16688277490485052681847773549197928630624828392248424077804829676011512392564 : <"babybear"> + %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 = felt.const 4622170486584704769521001011395820886029808520586507873417553166762370293671 : <"babybear"> + %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 = felt.const 16845753148201777192406958674202574751725237939980634861948953189320362207797 : <"babybear"> + %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 = felt.const 4623894483395123520243967718315330178025957095502546813929290333264120223168 : <"babybear"> + %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 = felt.const 5404287610364961067658660283245291234008692303120470305032076412056764726509 : <"babybear"> + %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 = felt.const 10796443006899450245502071131975731672911747129805343722228413358507805531141 : <"babybear"> + %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 = felt.const 8080173465267536232534446836148661251987053305394647905212781979099916615292 : <"babybear"> + %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 = felt.const 18146517657445423462330854383025300323335289319277199154920964274562014376193 : <"babybear"> + %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 = felt.const 20391289379084797414557439284689954098721219201171527383291525676334308303023 : <"babybear"> + %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 = felt.const 7556750851783822914673316211129907782679509728346361368978891584375551186255 : <"babybear"> + %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 = felt.const 3683645737503705042628598550438395339383572464204988015434959428676652575331 : <"babybear"> + %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 = felt.const 749264854018824809464168489785113337925400687349357088413132714480582918506 : <"babybear"> + %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 = felt.const 16771780563523793011283273687253985566177232886900511371656074413362142152543 : <"babybear"> + %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 = felt.const 11897542014760736209670863723231849628230383119798486487899539017466261308762 : <"babybear"> + %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 = felt.const 10005334761930299057035055370088813230849810566234116771751925093634136574742 : <"babybear"> + %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 = felt.const 17387238494588145257484818061490088963673275521250153686214197573695921400950 : <"babybear"> + %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 = felt.const 4798196928559910300796064665904583125427459076060519468052008159779219347957 : <"babybear"> + %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 = felt.const 9864183311657946807255900203841777810810224615118629957816193727554621093838 : <"babybear"> + %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 = felt.const 7207551498477838452286210989212982851118089401128156132319807392460388436957 : <"babybear"> + %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 = felt.const 7667462281466170157858259197976388676420847047604921256361474169980037581876 : <"babybear"> + %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 = felt.const 18162138253399958831050545255414688239130588254891200470934232514682584734511 : <"babybear"> + %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 = felt.const 1213715278223786725806155661738676903520350859678319590331207960381534602599 : <"babybear"> + %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 = felt.const 19886576439381707240399940949310933992335779767309383709787331470398675714258 : <"babybear"> + %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 = felt.const 17980351014018068290387269214713820287804403312720763401943303895585469787384 : <"babybear"> + %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 = felt.const 5024705281721889198577876690145313457398658950011302225525409148828000436681 : <"babybear"> + %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 = felt.const 7120861356467848435263064379192047478074060781135320967663101236819528304084 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@MiMCFeistel_0::@MiMCFeistel_0<[]>> + %nondet = llzk.nondet : !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<220 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<219 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<219 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !felt.type<"babybear"> + %nondet_4 = llzk.nondet : !array.type<220 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<218 x !felt.type<"babybear">> + array.write %nondet_5[%c0] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c3] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c4] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c5] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c6] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c7] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c8] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c9] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c10] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c11] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c12] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c13] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c14] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c15] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c16] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c17] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c18] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c19] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c20] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c21] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c22] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c23] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c24] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c25] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c26] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c27] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c28] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c29] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c30] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c31] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c32] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c33] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c34] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c35] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c36] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c37] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c38] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c39] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c40] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c41] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c42] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c43] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c44] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c45] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c46] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c47] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c48] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c49] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c50] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c51] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c52] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c53] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c54] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c55] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c56] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c57] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c58] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c59] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c60] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c61] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c62] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c63] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c64] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c65] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c66] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c67] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c68] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c69] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c70] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c71] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c72] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c73] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c74] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c75] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c76] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c77] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c78] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c79] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c80] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c81] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c82] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c83] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c84] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c85] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c86] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c87] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c88] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c89] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c90] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c91] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c92] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c93] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c94] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c95] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c96] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c97] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c98] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c99] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c100] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c101] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c102] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c103] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c104] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c105] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c106] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c107] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c108] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c109] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c110] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c111] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c112] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c113] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c114] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c115] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c116] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c117] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c118] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c119] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c120] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c121] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c122] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c123] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c124] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c125] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c126] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c127] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c128] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c129] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c130] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c131] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c132] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c133] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c134] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c135] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c136] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c137] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c138] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c139] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c140] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c141] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c142] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c143] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c144] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c145] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c146] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c147] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c148] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c149] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c150] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c151] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c152] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c153] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c154] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c155] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c156] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c157] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c158] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c159] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c160] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c161] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c162] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c163] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c164] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c165] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c166] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c167] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c168] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c169] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c170] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c171] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c172] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c173] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c174] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c175] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c176] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c177] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c178] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c179] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c180] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c181] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c182] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c183] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c184] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c185] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c186] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c187] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c188] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c189] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c190] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c191] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c192] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c193] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c194] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c195] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c196] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c197] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c198] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c199] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c200] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c201] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c202] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c203] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c204] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c205] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c206] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c207] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c208] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c209] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c210] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c211] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c212] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c213] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c214] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c215] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c216] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c217] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c0] = %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c3] = %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c4] = %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c5] = %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c6] = %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c7] = %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c8] = %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c9] = %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c10] = %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c11] = %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c12] = %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c13] = %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c14] = %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c15] = %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c16] = %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c17] = %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c18] = %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c19] = %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c20] = %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c21] = %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c22] = %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c23] = %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c24] = %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c25] = %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c26] = %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c27] = %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c28] = %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c29] = %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c30] = %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c31] = %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c32] = %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c33] = %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c34] = %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c35] = %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c36] = %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c37] = %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c38] = %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c39] = %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c40] = %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c41] = %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c42] = %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c43] = %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c44] = %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c45] = %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c46] = %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c47] = %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c48] = %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c49] = %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c50] = %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c51] = %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c52] = %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c53] = %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c54] = %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c55] = %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c56] = %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c57] = %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c58] = %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c59] = %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c60] = %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c61] = %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c62] = %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c63] = %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c64] = %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c65] = %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c66] = %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c67] = %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c68] = %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c69] = %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c70] = %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c71] = %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c72] = %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c73] = %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c74] = %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c75] = %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c76] = %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c77] = %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c78] = %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c79] = %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c80] = %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c81] = %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c82] = %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c83] = %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c84] = %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c85] = %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c86] = %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c87] = %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c88] = %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c89] = %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c90] = %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c91] = %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c92] = %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c93] = %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c94] = %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c95] = %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c96] = %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c97] = %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c98] = %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c99] = %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c100] = %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c101] = %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c102] = %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c103] = %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c104] = %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c105] = %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c106] = %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c107] = %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c108] = %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c109] = %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c110] = %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c111] = %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c112] = %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c113] = %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c114] = %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c115] = %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c116] = %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c117] = %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c118] = %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c119] = %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c120] = %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c121] = %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c122] = %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c123] = %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c124] = %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c125] = %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c126] = %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c127] = %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c128] = %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c129] = %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c130] = %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c131] = %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c132] = %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c133] = %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c134] = %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c135] = %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c136] = %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c137] = %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c138] = %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c139] = %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c140] = %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c141] = %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c142] = %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c143] = %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c144] = %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c145] = %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c146] = %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c147] = %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c148] = %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c149] = %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c150] = %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c151] = %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c152] = %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c153] = %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c154] = %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c155] = %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c156] = %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c157] = %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c158] = %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c159] = %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c160] = %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c161] = %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c162] = %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c163] = %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c164] = %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c165] = %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c166] = %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c167] = %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c168] = %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c169] = %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c170] = %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c171] = %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c172] = %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c173] = %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c174] = %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c175] = %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c176] = %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c177] = %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c178] = %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c179] = %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c180] = %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c181] = %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c182] = %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c183] = %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c184] = %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c185] = %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c186] = %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c187] = %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c188] = %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c189] = %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c190] = %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c191] = %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c192] = %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c193] = %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c194] = %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c195] = %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c196] = %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c197] = %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c198] = %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c199] = %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c200] = %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c201] = %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c202] = %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c203] = %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c204] = %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c205] = %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c206] = %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c207] = %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c208] = %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c209] = %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c210] = %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c211] = %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c212] = %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c213] = %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c214] = %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c215] = %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c216] = %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c217] = %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0:2 = scf.for %arg3 = %c0 to %c220 step %c1 iter_args(%arg4 = %nondet_3, %arg5 = %nondet) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp eq(%1, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = bool.or %2, %3 : i1, i1 + %5 = scf.if %4 -> (!felt.type<"babybear">) { + scf.yield %felt_const_0 : !felt.type<"babybear"> + } else { + %18 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %nondet_5[%19] : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } + %6 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %18 = felt.add %arg2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %18 : !felt.type<"babybear"> + } else { + %18 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %nondet_1[%19] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.add %arg2, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_4[%9] = %8 : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %nondet_4[%10] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %nondet_4[%12] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.mul %11, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%15] = %14 : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = bool.cmp lt(%1, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> + %17:2 = scf.if %16 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %18 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.if %18 -> (!felt.type<"babybear">) { + scf.yield %arg1 : !felt.type<"babybear"> + } else { + %26 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %nondet_2[%27] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %28 : !felt.type<"babybear"> + } + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%24] = %23 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %25 { + %26 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%26] = %arg0 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %26 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %26 : !felt.type<"babybear"> + %28 = array.read %nondet_1[%27] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%29] = %28 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %18 = array.read %nondet_2[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %nondet_0[%c219] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.mul %19, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@xRout] = %21 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> + %22 = array.read %nondet_1[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@xLout] = %22 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> + scf.yield %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %17#1, %17#0 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@t2] = %nondet_4 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> + struct.writem %self[@t4] = %nondet_0 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> + struct.writem %self[@xL] = %nondet_1 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> + struct.writem %self[@xR] = %nondet_2 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> + function.return %self : !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c220 = arith.constant 220 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_219 = felt.const 219 : <"babybear"> + %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 = felt.const 2119542016932434047340813757208803962484943912710204325088879681995922344971 : <"babybear"> + %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 = felt.const 11050822248291117548220126630860474473945266276626263036056336623671308219529 : <"babybear"> + %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 = felt.const 274945154732293792784580363548970818611304339008964723447672490026510689427 : <"babybear"> + %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 = felt.const 18224457394066545825553407391290108485121649197258948320896164404518684305122 : <"babybear"> + %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 = felt.const 14227467863135365427954093998621993651369686288941275436795622973781503444257 : <"babybear"> + %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 = felt.const 16085392195894691829567913404182676871326863890140775376809129785155092531260 : <"babybear"> + %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 = felt.const 5628039096440332922248578319648483863204530861778160259559031331287721255522 : <"babybear"> + %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 = felt.const 15162538063742142685306302282127534305212832649282186184583465569986719234456 : <"babybear"> + %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 = felt.const 2273205422216987330510475127669563545720586464429614439716564154166712854048 : <"babybear"> + %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 = felt.const 7400481189785154329569470986896455371037813715804007747228648863919991399081 : <"babybear"> + %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 = felt.const 16641596134749940573104316021365063031319260205559553673368334842484345864859 : <"babybear"> + %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 = felt.const 17297554111853491139852678417579991271009602631577069694853813331124433680030 : <"babybear"> + %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 = felt.const 6936272626871035740815028148058841877090860312517423346335878088297448888663 : <"babybear"> + %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 = felt.const 12732823292801537626009139514048596316076834307941224506504666470961250728055 : <"babybear"> + %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 = felt.const 6842203153996907264167856337497139692895299874139131328642472698663046726780 : <"babybear"> + %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 = felt.const 15117544653571553820496948522381772148324367479772362833334593000535648316185 : <"babybear"> + %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 = felt.const 6479667912792222539919362076122453947926362746906450079329453150607427372979 : <"babybear"> + %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 = felt.const 10702811721859145441471328511968332847175733707711670171718794132331147396634 : <"babybear"> + %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 = felt.const 12216779172735125538689875667307129262237123728082657485828359100719208190116 : <"babybear"> + %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 = felt.const 9244680976345080074252591214216060854998619670381671198295645618515047080988 : <"babybear"> + %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 = felt.const 8242601581342441750402731523736202888792436665415852106196418942315563860366 : <"babybear"> + %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 = felt.const 14016139747289624978792446847000951708158212463304817001882956166752906714332 : <"babybear"> + %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 = felt.const 17566185590731088197064706533119299946752127014428399631467913813769853431107 : <"babybear"> + %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 = felt.const 10814026414212439999107945133852431304483604215416531759535467355316227331774 : <"babybear"> + %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 = felt.const 11498264615058604317482574216318586415670903094838791165247179252175768794889 : <"babybear"> + %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 = felt.const 18664315914479294273286016871365663486061896605232511201418576829062292269769 : <"babybear"> + %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 = felt.const 19212515502973904821995111796203064175854996071497099383090983975618035391558 : <"babybear"> + %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 = felt.const 6614652990340435611114076169697104582524566019034036680161902142028967568142 : <"babybear"> + %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 = felt.const 8653175945487997845203439345797943132543211416447757110963967501177317426221 : <"babybear"> + %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 = felt.const 3819598418157732134449049289585680301176983019643974929528867686268702720163 : <"babybear"> + %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 = felt.const 1258781501221760320019859066036073675029057285507345332959539295621677296991 : <"babybear"> + %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 = felt.const 21578580340755653236050830649990190843552802306886938815497471545814130084980 : <"babybear"> + %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 = felt.const 15092262360719700162343163278648422751610766427236295023221516498310468956361 : <"babybear"> + %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 = felt.const 2929658084700714257515872921366736697080475676508114973627124569375444665664 : <"babybear"> + %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 = felt.const 19914849528178967155534624144358541535306360577227460456855821557421213606310 : <"babybear"> + %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 = felt.const 17047263688548829001253658727764731047114098556534482052135734487985276987385 : <"babybear"> + %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 = felt.const 19187314764836593118404597958543112407224947638377479622725713735224279297009 : <"babybear"> + %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 = felt.const 11028094245762332275225364962905938096659249161369092798505554939952525894293 : <"babybear"> + %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 = felt.const 5542499997310181530432302492142574333860449305424174466698068685590909336771 : <"babybear"> + %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 = felt.const 1205448543652932944633962232545707633928124666868453915721030884663332604536 : <"babybear"> + %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 = felt.const 5300440870136391278944213332144327695659161151625757537632832724102670898756 : <"babybear"> + %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 = felt.const 8777887112076272395250620301071581171386440850451972412060638225741125310886 : <"babybear"> + %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 = felt.const 5100105771517691442278432864090229416166996183792075307747582375962855820797 : <"babybear"> + %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 = felt.const 20871081766843466343749609089986071784031203517506781251203251608363835140622 : <"babybear"> + %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 = felt.const 19871836214837460419845806980869387567383718044439891735114283113359312279540 : <"babybear"> + %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 = felt.const 10796631184889302076168355684722130903785890709107732067446714470783437829037 : <"babybear"> + %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 = felt.const 6506225705710197163670556961299945987488979904603689017479840649664564978574 : <"babybear"> + %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 = felt.const 15016165746156232864069722572047169071786333815661109750860165034341572904221 : <"babybear"> + %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 = felt.const 15550788416669474113213749561488122552422887538676036667630838378023479382689 : <"babybear"> + %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 = felt.const 9783723818270121678386992630754842961728702994964214799008457449989291229500 : <"babybear"> + %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 = felt.const 19012287860122586147374214541764572282814469237161122489573881644994964647218 : <"babybear"> + %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 = felt.const 9558393272910366944245875920138649617479779893610128634419086981339060613250 : <"babybear"> + %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 = felt.const 8673089750662709235894359384294076697329948991010184356091130382437645649279 : <"babybear"> + %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 = felt.const 10493603554686607050979497281838644324893776154179810893893660722522945589063 : <"babybear"> + %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 = felt.const 9277135875276787021836189566799935097400042171346561246305113339462708861695 : <"babybear"> + %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 = felt.const 6252650284989960032925831409804233477770646333900692286731621844532438095656 : <"babybear"> + %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 = felt.const 16101132301514338989512946061786320637179843435886825102406248183507106312877 : <"babybear"> + %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 = felt.const 2494806857395134874309386694756263421445039103814920780777601708371037591569 : <"babybear"> + %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 = felt.const 12368712287081330853637674140264759478736012797026621876924395982504369598764 : <"babybear"> + %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 = felt.const 814913922521637742587885320797606426167962526342166512693085292151314976633 : <"babybear"> + %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 = felt.const 438123800976401478772659663183448617575635636575786782566035096946820525816 : <"babybear"> + %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 = felt.const 7733050956302327984762132317027414325566202380840692458138724610131603812560 : <"babybear"> + %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 = felt.const 15895485136902450169492923978042129726601461603404514670348703312850236146328 : <"babybear"> + %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 = felt.const 21280039024501430842616328642522421302481259067470872421086939673482530783142 : <"babybear"> + %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 = felt.const 3667030990325966886479548860429670833692690972701471494757671819017808678584 : <"babybear"> + %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 = felt.const 16690275395485630428127725067513114066329712673106153451801968992299636791385 : <"babybear"> + %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 = felt.const 14222898219492484180162096141564251903058269177856173968147960855133048449557 : <"babybear"> + %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 = felt.const 15566927854306879444693061574322104423426072650522411176731130806720753591030 : <"babybear"> + %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 = felt.const 11272653598912269895509621181205395118899451234151664604248382803490621227687 : <"babybear"> + %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 = felt.const 397690828254561723549349897112473766901585444153303054845160673059519614409 : <"babybear"> + %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 = felt.const 16143265650645676880461646123844627780378251900510645261875867423498913438066 : <"babybear"> + %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 = felt.const 4947482739415078212217504789923078546034438919537985740403824517728200332286 : <"babybear"> + %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 = felt.const 5894928453677122829055071981254202951712129328678534592916926069506935491729 : <"babybear"> + %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 = felt.const 16062117410185840274616925297332331018523844434907012275592638570193234893570 : <"babybear"> + %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 = felt.const 2204224910006646535594933495262085193210692406133533679934843341237521233504 : <"babybear"> + %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 = felt.const 2492729278659146790410698334997955258248120870028541691998279257260289595548 : <"babybear"> + %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 = felt.const 146494141603558321291767829522948454429758543710648402457451799015963102253 : <"babybear"> + %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 = felt.const 16901065971871379877929280081392692752968612240624985552337779093292740763381 : <"babybear"> + %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 = felt.const 18230936781133176044598070768084230333433368654744509969087239465125979720995 : <"babybear"> + %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 = felt.const 10780807212297131186617505517708903709488273075252405602261683478333331220733 : <"babybear"> + %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 = felt.const 19171031072692942278056619599721228021635671304612437350119663236604712493093 : <"babybear"> + %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 = felt.const 2825393571154632139467378429077438870179957021959813965940638905853993971879 : <"babybear"> + %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 = felt.const 4221265384902749246920810956363310125115516771964522748896154428740238579824 : <"babybear"> + %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 = felt.const 1888195070251580606973417065636430294417895423429240431595054184472931224452 : <"babybear"> + %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 = felt.const 1022951765127126818581466247360193856197472064872288389992480993218645055345 : <"babybear"> + %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 = felt.const 8677548159358013363291014307402600830078662555833653517843708051504582990832 : <"babybear"> + %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 = felt.const 4467191506765339364971058668792642195242197133011672559453028147641428433293 : <"babybear"> + %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 = felt.const 16729368143229828574342820060716366330476985824952922184463387490091156065099 : <"babybear"> + %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 = felt.const 21297149835078365363970699581821844234354988617890041296044775371855432973500 : <"babybear"> + %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 = felt.const 10090204501612803176317709245679152331057882187411777688746797044706063410969 : <"babybear"> + %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 = felt.const 248732676202643792226973868626360612151424823368345645514532870586234380100 : <"babybear"> + %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 = felt.const 3506345610354615013737144848471391553141006285964325596214723571988011984829 : <"babybear"> + %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 = felt.const 18364168158495573675698600238443218434246806358811328083953887470513967121206 : <"babybear"> + %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 = felt.const 4993662582188632374202316265508850988596880036291765531885657575099537176757 : <"babybear"> + %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 = felt.const 6678298831065390834922566306988418588227382406175769592902974103663687992230 : <"babybear"> + %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 = felt.const 10761027113757988230637066281488532903174559953630210849190212601991063767647 : <"babybear"> + %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 = felt.const 21171984405852590343970239018692870799717057961108910523876770029017785940991 : <"babybear"> + %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 = felt.const 21345603324471810861925019445720576814602636473739003852898308205213912255830 : <"babybear"> + %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 = felt.const 8465768840047024550750516678171433288207841931251654898809033371655109266663 : <"babybear"> + %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 = felt.const 16395063164993626722686882727042150241125309409717445381854913964674649318585 : <"babybear"> + %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 = felt.const 13973538843621261113924259058427434053808430378163734641175100160836376897004 : <"babybear"> + %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 = felt.const 14595204575654316237672764823862241845410365278802914304953002937313300553572 : <"babybear"> + %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 = felt.const 5027602491523497423798779154966735896562099398367163998686335127580757861872 : <"babybear"> + %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 = felt.const 792781492853909872425531014397300057232399608769451037135936617996830018501 : <"babybear"> + %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 = felt.const 20977948360215259915441258687649465618185769343138135384346964466965010873779 : <"babybear"> + %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 = felt.const 11311085442652291634822798307831431035776248927202286895207125867542470350078 : <"babybear"> + %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 = felt.const 6574066859860991369704567902211886840188702386542112593710271426704432301235 : <"babybear"> + %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 = felt.const 11246573086260753259993971254725613211193686683988426513880826148090811891866 : <"babybear"> + %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 = felt.const 10142447197759703415402259672441315777933858467700579946665223821199077641122 : <"babybear"> + %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 = felt.const 15487549757142039139328911515400805508248576685795694919457041092150651939253 : <"babybear"> + %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 = felt.const 18192064100315141084242006659317257023098826945893371479835220462302399655674 : <"babybear"> + %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 = felt.const 214219368547551689972421167733597094823289857206402800635962137077096090722 : <"babybear"> + %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 = felt.const 2391801327305361293476178683853802679507598622000359948432171562543560193350 : <"babybear"> + %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 = felt.const 4365864398105436789177703571412645548020537580493599380018290523813331678900 : <"babybear"> + %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 = felt.const 3981753758468103976812813304477670033098707002886030847251581853700311567551 : <"babybear"> + %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 = felt.const 10041051776251223165849354194892664881051125330236567356945669006147134614302 : <"babybear"> + %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 = felt.const 1571520786233540988201616650622796363168031165456869481368085474420849243232 : <"babybear"> + %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 = felt.const 17467794879902895769410571945152708684493991588672014763135370927880883292655 : <"babybear"> + %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 = felt.const 2821730726367472966906149684046356272806484545281639696873240305052362149654 : <"babybear"> + %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 = felt.const 11061717085931490100602849654034280576915102867237101935487893025907907250695 : <"babybear"> + %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 = felt.const 16709604795697901641948603019242067672006293290826991671766611326262532802914 : <"babybear"> + %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 = felt.const 3804047064713122820157099453648459188816376755739202017447862327783289895072 : <"babybear"> + %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 = felt.const 18787428285295558781869865751953016580493190547148386433580291216673009884554 : <"babybear"> + %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 = felt.const 14740327483193277147065845135561988641238516852487657117813536909482068950652 : <"babybear"> + %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 = felt.const 14731806221235869882801331463708736361296174006732553130708107037190460654379 : <"babybear"> + %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 = felt.const 2026733759645519472558796412979210009170379159866522399881566309631434814953 : <"babybear"> + %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 = felt.const 10484856914279112612610993418405543310546746652738541161791501150994088679557 : <"babybear"> + %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 = felt.const 32883284540320451295484135704808083452381176816565850047310272290579727564 : <"babybear"> + %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 = felt.const 2511432546938591792036639990606464315121646668029252285288323664350666551637 : <"babybear"> + %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 = felt.const 5007518659266430200134478928344522649876467369278722765097865662497773767152 : <"babybear"> + %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 = felt.const 1153669123397255702524721206511185557982017410156956216465120456256288427021 : <"babybear"> + %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 = felt.const 10810123816265612772922113403831964815724109728287572256602010709288980656498 : <"babybear"> + %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 = felt.const 1813584943682214789802230765734821149202472893379265320098816901270224589984 : <"babybear"> + %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 = felt.const 4923772847693564777744725640710197015181591950368494148029046443433103381621 : <"babybear"> + %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 = felt.const 21815578223768330433802113452339488275704145896544481092014911825656390567514 : <"babybear"> + %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 = felt.const 2016095394399807253596787752134573207202567875457560571095586743878953450738 : <"babybear"> + %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 = felt.const 10868453624107875516866146499877130701929063632959660262366632833504750028858 : <"babybear"> + %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 = felt.const 12200212977482648306758992405065921724409841940671166017620928947866825250857 : <"babybear"> + %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 = felt.const 176061952957067086877570020242717222844908281373122372938833890096257042779 : <"babybear"> + %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 = felt.const 8756385288462344550200229174435953103162307705310807828651304665320046782583 : <"babybear"> + %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 = felt.const 9607550223176946388146938069307456967842408600269548190739947540821716354749 : <"babybear"> + %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 = felt.const 11332046574800279729678603488745295198038913503395629790213378101166488244657 : <"babybear"> + %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 = felt.const 12771414330193951156383998390424063470766226667986423961689712557338777174205 : <"babybear"> + %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 = felt.const 18824274411769830274877839365728651108434404855803844568234862945613766611460 : <"babybear"> + %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 = felt.const 19001050671757720352890779127693793630251266879994702723636759889378387053056 : <"babybear"> + %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 = felt.const 148317947440800089795933930720822493695520852448386394775371401743494965187 : <"babybear"> + %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 = felt.const 7132325028834551397904855671244375895110341505383911719294705267624034122405 : <"babybear"> + %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 = felt.const 18725396114211370207078434315900726338547621160475533496863298091023511945076 : <"babybear"> + %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 = felt.const 16533189939837087893364000390641148516479148564190420358849587959161226782982 : <"babybear"> + %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 = felt.const 17784386835392322654196171115293700800825771210400152504776806618892170162248 : <"babybear"> + %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 = felt.const 10394369641533736715250242399198097296122982486516256408681925424076248952280 : <"babybear"> + %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 = felt.const 17213012626801210615058753489149961717422101711567228037597150941152495100640 : <"babybear"> + %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 = felt.const 8327443473179334761744301768309008451162322941906921742120510244986704677004 : <"babybear"> + %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 = felt.const 168282396747788514908709091757591226095443902501365500003618183905496160435 : <"babybear"> + %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 = felt.const 16390754464333401712265575949874369157699293840516802426621216808905079127650 : <"babybear"> + %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 = felt.const 8959562060028569701043973060670353733575345393653685776974948916988033453971 : <"babybear"> + %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 = felt.const 15618589556584434434009868216186115416835494805174158488636000580759692174228 : <"babybear"> + %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 = felt.const 916941639326869583414469202910306428966657806899788970948781207501251816730 : <"babybear"> + %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 = felt.const 13162342403579303950549728848130828093497701266240457479693991108217307949435 : <"babybear"> + %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 = felt.const 5363660674689121676875069134269386492382220935599781121306637800261912519729 : <"babybear"> + %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 = felt.const 12855514863299373699594410385788943772765811961581749194183533625311486462501 : <"babybear"> + %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 = felt.const 8837549193990558762776520822018694066937602576881497343584903902880277769302 : <"babybear"> + %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 = felt.const 5543749482491340532547407723464609328207990784853381797689466144924198391839 : <"babybear"> + %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 = felt.const 11760570435432189127645691249600821064883781677693087773459065574359292849137 : <"babybear"> + %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 = felt.const 2246692432011290582160062129070762007374502637007107318105405626910313810224 : <"babybear"> + %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 = felt.const 5203908808704813498389265425172875593837960384349653691918590736979872578408 : <"babybear"> + %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 = felt.const 6545064306297957002139416752334741502722251869537551068239642131448768236585 : <"babybear"> + %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 = felt.const 3113973447392053821824427670386252797811804954746053461397972968381571297505 : <"babybear"> + %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 = felt.const 11501810868606870391127866188394535330696206817602260610801897042898616817272 : <"babybear"> + %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 = felt.const 19346204940546791021518535594447257347218878114049998691060016493806845179755 : <"babybear"> + %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 = felt.const 7642160509228669138628515458941659189680509753651629476399516332224325757132 : <"babybear"> + %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 = felt.const 17198004293191777441573635123110935015228014028618868252989374962722329283022 : <"babybear"> + %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 = felt.const 3180973917010545328313139835982464870638521890385603025657430208141494469656 : <"babybear"> + %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 = felt.const 20196970640587451358539129330170636295243141659030208529338914906436009086943 : <"babybear"> + %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 = felt.const 153011722355526826233082383360057587249818749719433916258246100068258954737 : <"babybear"> + %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 = felt.const 2832093654883670345969792724123161241696170611611744759675180839473215203706 : <"babybear"> + %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 = felt.const 10165780782761211520836029617746977303303335603838343292431760011576528327409 : <"babybear"> + %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 = felt.const 20241898894740093733047052816576694435372877719072347814065227797906130857593 : <"babybear"> + %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 = felt.const 10858157235265583624235850660462324469799552996870780238992046963007491306222 : <"babybear"> + %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 = felt.const 6745410632962119604799318394592010194450845483518862700079921360015766217097 : <"babybear"> + %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 = felt.const 6302388219880227251325608388535181451187131054211388356563634768253301290116 : <"babybear"> + %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 = felt.const 1720059427972723034107765345743336447947522473310069975142483982753181038321 : <"babybear"> + %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 = felt.const 10097732913112662248360143041019433907849917041759137293018029019134392559350 : <"babybear"> + %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 = felt.const 4144769320246558352780591737261172907511489963810975650573703217887429086546 : <"babybear"> + %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 = felt.const 5521922218264623411380547905210139511350706092570900075727555783240701821773 : <"babybear"> + %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 = felt.const 19669450123472657781282985229369348220906547335081730205028099210442632534079 : <"babybear"> + %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 = felt.const 15189693413320228845990326214136820307649565437237093707846682797649429515840 : <"babybear"> + %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 = felt.const 18875020877782404439294079398043479420415331640996249745272087358069018086569 : <"babybear"> + %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 = felt.const 148924106504065664829055598316821983869409581623245780505601526786791681102 : <"babybear"> + %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 = felt.const 1888098689545151571063267806606510032698677328923740058080630641742325067877 : <"babybear"> + %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 = felt.const 2436445725746972287496138382764643208791713986676129260589667864467010129482 : <"babybear"> + %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 = felt.const 11878652861183667748838188993669912629573713271883125458838494308957689090959 : <"babybear"> + %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 = felt.const 16688277490485052681847773549197928630624828392248424077804829676011512392564 : <"babybear"> + %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 = felt.const 4622170486584704769521001011395820886029808520586507873417553166762370293671 : <"babybear"> + %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 = felt.const 16845753148201777192406958674202574751725237939980634861948953189320362207797 : <"babybear"> + %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 = felt.const 4623894483395123520243967718315330178025957095502546813929290333264120223168 : <"babybear"> + %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 = felt.const 5404287610364961067658660283245291234008692303120470305032076412056764726509 : <"babybear"> + %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 = felt.const 10796443006899450245502071131975731672911747129805343722228413358507805531141 : <"babybear"> + %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 = felt.const 8080173465267536232534446836148661251987053305394647905212781979099916615292 : <"babybear"> + %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 = felt.const 18146517657445423462330854383025300323335289319277199154920964274562014376193 : <"babybear"> + %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 = felt.const 20391289379084797414557439284689954098721219201171527383291525676334308303023 : <"babybear"> + %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 = felt.const 7556750851783822914673316211129907782679509728346361368978891584375551186255 : <"babybear"> + %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 = felt.const 3683645737503705042628598550438395339383572464204988015434959428676652575331 : <"babybear"> + %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 = felt.const 749264854018824809464168489785113337925400687349357088413132714480582918506 : <"babybear"> + %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 = felt.const 16771780563523793011283273687253985566177232886900511371656074413362142152543 : <"babybear"> + %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 = felt.const 11897542014760736209670863723231849628230383119798486487899539017466261308762 : <"babybear"> + %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 = felt.const 10005334761930299057035055370088813230849810566234116771751925093634136574742 : <"babybear"> + %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 = felt.const 17387238494588145257484818061490088963673275521250153686214197573695921400950 : <"babybear"> + %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 = felt.const 4798196928559910300796064665904583125427459076060519468052008159779219347957 : <"babybear"> + %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 = felt.const 9864183311657946807255900203841777810810224615118629957816193727554621093838 : <"babybear"> + %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 = felt.const 7207551498477838452286210989212982851118089401128156132319807392460388436957 : <"babybear"> + %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 = felt.const 7667462281466170157858259197976388676420847047604921256361474169980037581876 : <"babybear"> + %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 = felt.const 18162138253399958831050545255414688239130588254891200470934232514682584734511 : <"babybear"> + %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 = felt.const 1213715278223786725806155661738676903520350859678319590331207960381534602599 : <"babybear"> + %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 = felt.const 19886576439381707240399940949310933992335779767309383709787331470398675714258 : <"babybear"> + %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 = felt.const 17980351014018068290387269214713820287804403312720763401943303895585469787384 : <"babybear"> + %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 = felt.const 5024705281721889198577876690145313457398658950011302225525409148828000436681 : <"babybear"> + %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 = felt.const 7120861356467848435263064379192047478074060781135320967663101236819528304084 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@t2] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@t4] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@xL] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@xR] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> + %nondet = llzk.nondet : !array.type<218 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c200] = %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c201] = %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c202] = %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c203] = %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c204] = %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c205] = %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c206] = %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c207] = %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c208] = %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c209] = %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c210] = %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c211] = %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c212] = %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c213] = %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c214] = %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c215] = %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c216] = %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c217] = %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c220 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = bool.cmp eq(%6, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = bool.or %7, %8 : i1, i1 + %10 = scf.if %9 -> (!felt.type<"babybear">) { + scf.yield %felt_const_0 : !felt.type<"babybear"> + } else { + %24 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %24 : !felt.type<"babybear"> + %26 = array.read %nondet[%25] : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } + %11 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %24 = felt.add %arg3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %24 : !felt.type<"babybear"> + } else { + %24 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %24 : !felt.type<"babybear"> + %26 = array.read %4[%25] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %arg3, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.add %27, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %28 : !felt.type<"babybear"> + } + %13 = felt.mul %12, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = array.read %2[%14] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %6 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %6 : !felt.type<"babybear"> + %19 = array.read %2[%18] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.mul %17, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %6 : !felt.type<"babybear"> + %22 = array.read %3[%21] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = bool.cmp lt(%6, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %23 { + %24 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = scf.if %24 -> (!felt.type<"babybear">) { + scf.yield %arg2 : !felt.type<"babybear"> + } else { + %33 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + %35 = array.read %5[%34] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %35 : !felt.type<"babybear"> + } + %26 = cast.toindex %6 : !felt.type<"babybear"> + %27 = array.read %3[%26] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %27, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = felt.add %25, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %6 : !felt.type<"babybear"> + %31 = array.read %4[%30] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %32 { + %33 = cast.toindex %6 : !felt.type<"babybear"> + %34 = array.read %5[%33] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %34, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %33 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + %35 = array.read %4[%34] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = cast.toindex %6 : !felt.type<"babybear"> + %37 = array.read %5[%36] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } else { + %24 = array.read %5[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %3[%c219] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.mul %25, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = array.read %4[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @MiMCSponge_1 { + struct.def @MiMCSponge_1 { + struct.member @outs : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @S : !array.type<4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> + struct.member @S$inputs : !array.type<4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMCSponge_1::@MiMCSponge_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@MiMCSponge_1::@MiMCSponge_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c3 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %9 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array_0[%10] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %11[@k] = %arg1 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%12] = %11 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array[%13] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %14[@count] = %16 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %19 = pod.read %11[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %11[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %11[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%19, %20, %21) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %14[@comp] = %22 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%23] = %14 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %18 = bool.cmp eq(%9, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %18 { + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_0[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %20[@xLin] = %19 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %20 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %21 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %30 = pod.read %20[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %20[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %20[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%30, %31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %21[@comp] = %33 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c0] = %21 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = array.read %array_0[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %25[@xRin] = %felt_const_0 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %25 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %26 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %30 = pod.read %25[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %25[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %25[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%30, %31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %26[@comp] = %33 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c0] = %26 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %19 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %20 = pod.read %19[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_0[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %24[@xLin] = %23 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %24 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %25 = array.read %array[%c1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %37 = pod.read %24[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %24[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %24[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %40 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%37, %38, %39) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %25[@comp] = %40 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c1] = %25 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %30 = pod.read %29[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %31 = struct.readm %30[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@xRin] = %31 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %32 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %33 = array.read %array[%c1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %34 = pod.read %33[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %33[@count] = %35 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %37 = pod.read %32[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %32[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %32[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %40 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%37, %38, %39) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %33[@comp] = %40 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c1] = %33 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + %0 = array.read %array[%c1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %2 = struct.readm %1[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %2 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%11] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %12[@k] = %arg1 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%14] = %12 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %15 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array[%16] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %62 = pod.read %12[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %12[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %12[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%62, %63, %64) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %17[@comp] = %65 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %66 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%67] = %17 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %21 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %26 = struct.readm %25[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_0[%28] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %29[@xLin] = %26 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%31] = %29 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %32 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array[%33] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %62 = pod.read %29[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %29[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %29[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%62, %63, %64) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %34[@comp] = %65 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %66 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%67] = %34 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %38, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array[%40] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %42 = pod.read %41[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %43 = struct.readm %42[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %array_0[%45] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %46[@xRin] = %43 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %47 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%48] = %46 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %49 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array[%50] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %62 = pod.read %46[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %46[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %46[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%62, %63, %64) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %51[@comp] = %65 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %66 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%67] = %51 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %55 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array[%56] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %58 = pod.read %57[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %59 = struct.readm %58[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %60 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%61] = %59 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@S$inputs] = %array_0 : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array_1[%arg2] = %10 : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@S] = %array_1 : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> {product_source = "compute"} + struct.writem %self[@outs] = %nondet : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@outs] : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@S] : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@S$inputs] : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %5[%10] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = pod.read %11[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = bool.cmp eq(%9, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %13 { + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %5[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %16 = pod.read %15[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %5[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %14 = array.read %4[%c0] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %15 = struct.readm %14[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %5[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %4[%c0] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %5[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = array.read %4[%c1] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %7 = struct.readm %6[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %3[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %5[%11] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %4[%16] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %5[%20] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %22 = pod.read %21[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.sub %23, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %4[%25] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %27 = struct.readm %26[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %5[%29] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %31 = pod.read %30[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %4[%33] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %35 = struct.readm %34[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %3[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %9 = array.read %4[%arg2] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %10 = array.read %5[%arg2] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %10[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %10[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMCFeistel_0::@MiMCFeistel_0::@constrain(%9, %11, %12, %13) : (!struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@MiMCSponge_1::@MiMCSponge_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMCSponge_1::@MiMCSponge_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@MiMCSponge_1::@MiMCSponge_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c3 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %3 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array_0[%4] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %5[@k] = %arg1 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%6] = %5 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array[%7] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %8[@count] = %10 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %13 = pod.read %5[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %5[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %5[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%13, %14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %8[@comp] = %16 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %17 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%17] = %8 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %12 = bool.cmp eq(%3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_0[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %14[@xLin] = %13 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %14 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %15 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %24 = pod.read %14[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %14[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %14[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%24, %25, %26) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %15[@comp] = %27 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c0] = %15 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %19 = array.read %array_0[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@xRin] = %felt_const_0 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %19 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %20 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %19[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %19[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %19[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%24, %25, %26) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %20[@comp] = %27 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c0] = %20 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %13 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %15 = struct.readm %14[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array_0[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %18[@xLin] = %17 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %18 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %19 = array.read %array[%c1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %31 = pod.read %18[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %18[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %18[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%31, %32, %33) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %19[@comp] = %34 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c1] = %19 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %23 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %25 = struct.readm %24[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_0[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %26[@xRin] = %25 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %26 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %27 = array.read %array[%c1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %28 = pod.read %27[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %27[@count] = %29 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %31 = pod.read %26[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %26[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %26[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%31, %32, %33) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %27[@comp] = %34 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array[%c1] = %27 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + %0 = array.read %array[%c1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %2 = struct.readm %1[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %2 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_0[%5] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %6[@k] = %arg1 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%8] = %6 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %9 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array[%10] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %11[@count] = %13 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %56 = pod.read %6[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %6[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %6[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %11[@comp] = %59 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %60 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%61] = %11 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %15 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array[%17] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %20 = struct.readm %19[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_0[%22] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@xLin] = %20 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%25] = %23 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %26 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array[%27] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %56 = pod.read %23[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %23[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %23[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %28[@comp] = %59 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %60 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%61] = %28 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %32 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %32, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%34] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %37 = struct.readm %36[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_0[%39] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %40[@xRin] = %37 : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%42] = %40 : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "compute"} + %43 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %array[%44] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %46 = pod.read %45[@count] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.subi %46, %c1 {product_source = "compute"} : index + pod.write %45[@count] = %47 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.cmpi eq, %47, %c0 {product_source = "compute"} : index + scf.if %48 { + %56 = pod.read %40[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %40[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %40[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @MiMCFeistel_0::@MiMCFeistel_0::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + pod.write %45[@comp] = %59 : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %60 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%61] = %45 : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %49 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array[%50] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %53 = struct.readm %52[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%55] = %53 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@S$inputs] = %array_0 : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + array.write %array_1[%arg2] = %4 : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@S] = %array_1 : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> {product_source = "compute"} + struct.writem %self[@outs] = %nondet : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MiMCSponge_1::@MiMCSponge_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMCSponge_1::@MiMCSponge_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@outs] : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@S] : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@S$inputs] : <@MiMCSponge_1::@MiMCSponge_1<[]>>, !array.type<4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %2[%7] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %9 = pod.read %8[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %10 { + %11 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %2[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %2[%c0] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %11 = array.read %1[%c0] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %12 = struct.readm %11[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %2[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %16 = pod.read %15[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%c0] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %18 = struct.readm %17[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%c1] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %20 = pod.read %19[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %3 = array.read %1[%c1] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %4 = struct.readm %3[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %6 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %2[%8] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %10 = pod.read %9[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.sub %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%13] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %15 = struct.readm %14[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.sub %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %1[%22] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %24 = struct.readm %23[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %2[%26] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %1[%30] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %32 = struct.readm %31[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %0[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %6 = array.read %1[%arg3] : <4 x !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>>, !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "constrain"} + %7 = array.read %2[%arg3] : <4 x !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>>, !pod.type<[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@xLin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %7[@xRin] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %7[@k] : <[@xLin: !felt.type<"babybear">, @xRin: !felt.type<"babybear">, @k: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @MiMCFeistel_0::@MiMCFeistel_0::@constrain(%6, %8, %9, %10) : (!struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mimc_sponge_test.llzk b/examples/circom-demo/mimc_sponge_test.llzk new file mode 100644 index 0000000..cc9df48 --- /dev/null +++ b/examples/circom-demo/mimc_sponge_test.llzk @@ -0,0 +1,3436 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>} { + poly.template @MiMCFeistel_0 { + struct.def @MiMCFeistel_0 { + struct.member @xLout : !felt.type<"babybear"> {llzk.pub} + struct.member @xRout : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<220 x !felt.type<"babybear">> + struct.member @t4 : !array.type<220 x !felt.type<"babybear">> + struct.member @xL : !array.type<219 x !felt.type<"babybear">> + struct.member @xR : !array.type<219 x !felt.type<"babybear">> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c220 = arith.constant 220 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_219 = felt.const 219 : <"babybear"> {product_source = "compute"} + %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 = felt.const 2119542016932434047340813757208803962484943912710204325088879681995922344971 : <"babybear"> {product_source = "compute"} + %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 = felt.const 11050822248291117548220126630860474473945266276626263036056336623671308219529 : <"babybear"> {product_source = "compute"} + %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 = felt.const 274945154732293792784580363548970818611304339008964723447672490026510689427 : <"babybear"> {product_source = "compute"} + %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 = felt.const 18224457394066545825553407391290108485121649197258948320896164404518684305122 : <"babybear"> {product_source = "compute"} + %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 = felt.const 14227467863135365427954093998621993651369686288941275436795622973781503444257 : <"babybear"> {product_source = "compute"} + %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 = felt.const 16085392195894691829567913404182676871326863890140775376809129785155092531260 : <"babybear"> {product_source = "compute"} + %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 = felt.const 5628039096440332922248578319648483863204530861778160259559031331287721255522 : <"babybear"> {product_source = "compute"} + %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 = felt.const 15162538063742142685306302282127534305212832649282186184583465569986719234456 : <"babybear"> {product_source = "compute"} + %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 = felt.const 2273205422216987330510475127669563545720586464429614439716564154166712854048 : <"babybear"> {product_source = "compute"} + %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 = felt.const 7400481189785154329569470986896455371037813715804007747228648863919991399081 : <"babybear"> {product_source = "compute"} + %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 = felt.const 16641596134749940573104316021365063031319260205559553673368334842484345864859 : <"babybear"> {product_source = "compute"} + %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 = felt.const 17297554111853491139852678417579991271009602631577069694853813331124433680030 : <"babybear"> {product_source = "compute"} + %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 = felt.const 6936272626871035740815028148058841877090860312517423346335878088297448888663 : <"babybear"> {product_source = "compute"} + %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 = felt.const 12732823292801537626009139514048596316076834307941224506504666470961250728055 : <"babybear"> {product_source = "compute"} + %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 = felt.const 6842203153996907264167856337497139692895299874139131328642472698663046726780 : <"babybear"> {product_source = "compute"} + %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 = felt.const 15117544653571553820496948522381772148324367479772362833334593000535648316185 : <"babybear"> {product_source = "compute"} + %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 = felt.const 6479667912792222539919362076122453947926362746906450079329453150607427372979 : <"babybear"> {product_source = "compute"} + %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 = felt.const 10702811721859145441471328511968332847175733707711670171718794132331147396634 : <"babybear"> {product_source = "compute"} + %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 = felt.const 12216779172735125538689875667307129262237123728082657485828359100719208190116 : <"babybear"> {product_source = "compute"} + %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 = felt.const 9244680976345080074252591214216060854998619670381671198295645618515047080988 : <"babybear"> {product_source = "compute"} + %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 = felt.const 8242601581342441750402731523736202888792436665415852106196418942315563860366 : <"babybear"> {product_source = "compute"} + %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 = felt.const 14016139747289624978792446847000951708158212463304817001882956166752906714332 : <"babybear"> {product_source = "compute"} + %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 = felt.const 17566185590731088197064706533119299946752127014428399631467913813769853431107 : <"babybear"> {product_source = "compute"} + %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 = felt.const 10814026414212439999107945133852431304483604215416531759535467355316227331774 : <"babybear"> {product_source = "compute"} + %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 = felt.const 11498264615058604317482574216318586415670903094838791165247179252175768794889 : <"babybear"> {product_source = "compute"} + %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 = felt.const 18664315914479294273286016871365663486061896605232511201418576829062292269769 : <"babybear"> {product_source = "compute"} + %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 = felt.const 19212515502973904821995111796203064175854996071497099383090983975618035391558 : <"babybear"> {product_source = "compute"} + %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 = felt.const 6614652990340435611114076169697104582524566019034036680161902142028967568142 : <"babybear"> {product_source = "compute"} + %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 = felt.const 8653175945487997845203439345797943132543211416447757110963967501177317426221 : <"babybear"> {product_source = "compute"} + %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 = felt.const 3819598418157732134449049289585680301176983019643974929528867686268702720163 : <"babybear"> {product_source = "compute"} + %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 = felt.const 1258781501221760320019859066036073675029057285507345332959539295621677296991 : <"babybear"> {product_source = "compute"} + %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 = felt.const 21578580340755653236050830649990190843552802306886938815497471545814130084980 : <"babybear"> {product_source = "compute"} + %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 = felt.const 15092262360719700162343163278648422751610766427236295023221516498310468956361 : <"babybear"> {product_source = "compute"} + %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 = felt.const 2929658084700714257515872921366736697080475676508114973627124569375444665664 : <"babybear"> {product_source = "compute"} + %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 = felt.const 19914849528178967155534624144358541535306360577227460456855821557421213606310 : <"babybear"> {product_source = "compute"} + %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 = felt.const 17047263688548829001253658727764731047114098556534482052135734487985276987385 : <"babybear"> {product_source = "compute"} + %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 = felt.const 19187314764836593118404597958543112407224947638377479622725713735224279297009 : <"babybear"> {product_source = "compute"} + %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 = felt.const 11028094245762332275225364962905938096659249161369092798505554939952525894293 : <"babybear"> {product_source = "compute"} + %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 = felt.const 5542499997310181530432302492142574333860449305424174466698068685590909336771 : <"babybear"> {product_source = "compute"} + %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 = felt.const 1205448543652932944633962232545707633928124666868453915721030884663332604536 : <"babybear"> {product_source = "compute"} + %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 = felt.const 5300440870136391278944213332144327695659161151625757537632832724102670898756 : <"babybear"> {product_source = "compute"} + %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 = felt.const 8777887112076272395250620301071581171386440850451972412060638225741125310886 : <"babybear"> {product_source = "compute"} + %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 = felt.const 5100105771517691442278432864090229416166996183792075307747582375962855820797 : <"babybear"> {product_source = "compute"} + %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 = felt.const 20871081766843466343749609089986071784031203517506781251203251608363835140622 : <"babybear"> {product_source = "compute"} + %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 = felt.const 19871836214837460419845806980869387567383718044439891735114283113359312279540 : <"babybear"> {product_source = "compute"} + %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 = felt.const 10796631184889302076168355684722130903785890709107732067446714470783437829037 : <"babybear"> {product_source = "compute"} + %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 = felt.const 6506225705710197163670556961299945987488979904603689017479840649664564978574 : <"babybear"> {product_source = "compute"} + %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 = felt.const 15016165746156232864069722572047169071786333815661109750860165034341572904221 : <"babybear"> {product_source = "compute"} + %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 = felt.const 15550788416669474113213749561488122552422887538676036667630838378023479382689 : <"babybear"> {product_source = "compute"} + %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 = felt.const 9783723818270121678386992630754842961728702994964214799008457449989291229500 : <"babybear"> {product_source = "compute"} + %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 = felt.const 19012287860122586147374214541764572282814469237161122489573881644994964647218 : <"babybear"> {product_source = "compute"} + %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 = felt.const 9558393272910366944245875920138649617479779893610128634419086981339060613250 : <"babybear"> {product_source = "compute"} + %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 = felt.const 8673089750662709235894359384294076697329948991010184356091130382437645649279 : <"babybear"> {product_source = "compute"} + %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 = felt.const 10493603554686607050979497281838644324893776154179810893893660722522945589063 : <"babybear"> {product_source = "compute"} + %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 = felt.const 9277135875276787021836189566799935097400042171346561246305113339462708861695 : <"babybear"> {product_source = "compute"} + %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 = felt.const 6252650284989960032925831409804233477770646333900692286731621844532438095656 : <"babybear"> {product_source = "compute"} + %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 = felt.const 16101132301514338989512946061786320637179843435886825102406248183507106312877 : <"babybear"> {product_source = "compute"} + %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 = felt.const 2494806857395134874309386694756263421445039103814920780777601708371037591569 : <"babybear"> {product_source = "compute"} + %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 = felt.const 12368712287081330853637674140264759478736012797026621876924395982504369598764 : <"babybear"> {product_source = "compute"} + %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 = felt.const 814913922521637742587885320797606426167962526342166512693085292151314976633 : <"babybear"> {product_source = "compute"} + %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 = felt.const 438123800976401478772659663183448617575635636575786782566035096946820525816 : <"babybear"> {product_source = "compute"} + %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 = felt.const 7733050956302327984762132317027414325566202380840692458138724610131603812560 : <"babybear"> {product_source = "compute"} + %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 = felt.const 15895485136902450169492923978042129726601461603404514670348703312850236146328 : <"babybear"> {product_source = "compute"} + %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 = felt.const 21280039024501430842616328642522421302481259067470872421086939673482530783142 : <"babybear"> {product_source = "compute"} + %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 = felt.const 3667030990325966886479548860429670833692690972701471494757671819017808678584 : <"babybear"> {product_source = "compute"} + %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 = felt.const 16690275395485630428127725067513114066329712673106153451801968992299636791385 : <"babybear"> {product_source = "compute"} + %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 = felt.const 14222898219492484180162096141564251903058269177856173968147960855133048449557 : <"babybear"> {product_source = "compute"} + %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 = felt.const 15566927854306879444693061574322104423426072650522411176731130806720753591030 : <"babybear"> {product_source = "compute"} + %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 = felt.const 11272653598912269895509621181205395118899451234151664604248382803490621227687 : <"babybear"> {product_source = "compute"} + %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 = felt.const 397690828254561723549349897112473766901585444153303054845160673059519614409 : <"babybear"> {product_source = "compute"} + %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 = felt.const 16143265650645676880461646123844627780378251900510645261875867423498913438066 : <"babybear"> {product_source = "compute"} + %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 = felt.const 4947482739415078212217504789923078546034438919537985740403824517728200332286 : <"babybear"> {product_source = "compute"} + %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 = felt.const 5894928453677122829055071981254202951712129328678534592916926069506935491729 : <"babybear"> {product_source = "compute"} + %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 = felt.const 16062117410185840274616925297332331018523844434907012275592638570193234893570 : <"babybear"> {product_source = "compute"} + %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 = felt.const 2204224910006646535594933495262085193210692406133533679934843341237521233504 : <"babybear"> {product_source = "compute"} + %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 = felt.const 2492729278659146790410698334997955258248120870028541691998279257260289595548 : <"babybear"> {product_source = "compute"} + %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 = felt.const 146494141603558321291767829522948454429758543710648402457451799015963102253 : <"babybear"> {product_source = "compute"} + %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 = felt.const 16901065971871379877929280081392692752968612240624985552337779093292740763381 : <"babybear"> {product_source = "compute"} + %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 = felt.const 18230936781133176044598070768084230333433368654744509969087239465125979720995 : <"babybear"> {product_source = "compute"} + %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 = felt.const 10780807212297131186617505517708903709488273075252405602261683478333331220733 : <"babybear"> {product_source = "compute"} + %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 = felt.const 19171031072692942278056619599721228021635671304612437350119663236604712493093 : <"babybear"> {product_source = "compute"} + %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 = felt.const 2825393571154632139467378429077438870179957021959813965940638905853993971879 : <"babybear"> {product_source = "compute"} + %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 = felt.const 4221265384902749246920810956363310125115516771964522748896154428740238579824 : <"babybear"> {product_source = "compute"} + %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 = felt.const 1888195070251580606973417065636430294417895423429240431595054184472931224452 : <"babybear"> {product_source = "compute"} + %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 = felt.const 1022951765127126818581466247360193856197472064872288389992480993218645055345 : <"babybear"> {product_source = "compute"} + %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 = felt.const 8677548159358013363291014307402600830078662555833653517843708051504582990832 : <"babybear"> {product_source = "compute"} + %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 = felt.const 4467191506765339364971058668792642195242197133011672559453028147641428433293 : <"babybear"> {product_source = "compute"} + %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 = felt.const 16729368143229828574342820060716366330476985824952922184463387490091156065099 : <"babybear"> {product_source = "compute"} + %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 = felt.const 21297149835078365363970699581821844234354988617890041296044775371855432973500 : <"babybear"> {product_source = "compute"} + %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 = felt.const 10090204501612803176317709245679152331057882187411777688746797044706063410969 : <"babybear"> {product_source = "compute"} + %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 = felt.const 248732676202643792226973868626360612151424823368345645514532870586234380100 : <"babybear"> {product_source = "compute"} + %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 = felt.const 3506345610354615013737144848471391553141006285964325596214723571988011984829 : <"babybear"> {product_source = "compute"} + %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 = felt.const 18364168158495573675698600238443218434246806358811328083953887470513967121206 : <"babybear"> {product_source = "compute"} + %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 = felt.const 4993662582188632374202316265508850988596880036291765531885657575099537176757 : <"babybear"> {product_source = "compute"} + %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 = felt.const 6678298831065390834922566306988418588227382406175769592902974103663687992230 : <"babybear"> {product_source = "compute"} + %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 = felt.const 10761027113757988230637066281488532903174559953630210849190212601991063767647 : <"babybear"> {product_source = "compute"} + %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 = felt.const 21171984405852590343970239018692870799717057961108910523876770029017785940991 : <"babybear"> {product_source = "compute"} + %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 = felt.const 21345603324471810861925019445720576814602636473739003852898308205213912255830 : <"babybear"> {product_source = "compute"} + %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 = felt.const 8465768840047024550750516678171433288207841931251654898809033371655109266663 : <"babybear"> {product_source = "compute"} + %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 = felt.const 16395063164993626722686882727042150241125309409717445381854913964674649318585 : <"babybear"> {product_source = "compute"} + %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 = felt.const 13973538843621261113924259058427434053808430378163734641175100160836376897004 : <"babybear"> {product_source = "compute"} + %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 = felt.const 14595204575654316237672764823862241845410365278802914304953002937313300553572 : <"babybear"> {product_source = "compute"} + %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 = felt.const 5027602491523497423798779154966735896562099398367163998686335127580757861872 : <"babybear"> {product_source = "compute"} + %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 = felt.const 792781492853909872425531014397300057232399608769451037135936617996830018501 : <"babybear"> {product_source = "compute"} + %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 = felt.const 20977948360215259915441258687649465618185769343138135384346964466965010873779 : <"babybear"> {product_source = "compute"} + %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 = felt.const 11311085442652291634822798307831431035776248927202286895207125867542470350078 : <"babybear"> {product_source = "compute"} + %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 = felt.const 6574066859860991369704567902211886840188702386542112593710271426704432301235 : <"babybear"> {product_source = "compute"} + %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 = felt.const 11246573086260753259993971254725613211193686683988426513880826148090811891866 : <"babybear"> {product_source = "compute"} + %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 = felt.const 10142447197759703415402259672441315777933858467700579946665223821199077641122 : <"babybear"> {product_source = "compute"} + %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 = felt.const 15487549757142039139328911515400805508248576685795694919457041092150651939253 : <"babybear"> {product_source = "compute"} + %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 = felt.const 18192064100315141084242006659317257023098826945893371479835220462302399655674 : <"babybear"> {product_source = "compute"} + %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 = felt.const 214219368547551689972421167733597094823289857206402800635962137077096090722 : <"babybear"> {product_source = "compute"} + %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 = felt.const 2391801327305361293476178683853802679507598622000359948432171562543560193350 : <"babybear"> {product_source = "compute"} + %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 = felt.const 4365864398105436789177703571412645548020537580493599380018290523813331678900 : <"babybear"> {product_source = "compute"} + %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 = felt.const 3981753758468103976812813304477670033098707002886030847251581853700311567551 : <"babybear"> {product_source = "compute"} + %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 = felt.const 10041051776251223165849354194892664881051125330236567356945669006147134614302 : <"babybear"> {product_source = "compute"} + %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 = felt.const 1571520786233540988201616650622796363168031165456869481368085474420849243232 : <"babybear"> {product_source = "compute"} + %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 = felt.const 17467794879902895769410571945152708684493991588672014763135370927880883292655 : <"babybear"> {product_source = "compute"} + %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 = felt.const 2821730726367472966906149684046356272806484545281639696873240305052362149654 : <"babybear"> {product_source = "compute"} + %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 = felt.const 11061717085931490100602849654034280576915102867237101935487893025907907250695 : <"babybear"> {product_source = "compute"} + %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 = felt.const 16709604795697901641948603019242067672006293290826991671766611326262532802914 : <"babybear"> {product_source = "compute"} + %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 = felt.const 3804047064713122820157099453648459188816376755739202017447862327783289895072 : <"babybear"> {product_source = "compute"} + %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 = felt.const 18787428285295558781869865751953016580493190547148386433580291216673009884554 : <"babybear"> {product_source = "compute"} + %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 = felt.const 14740327483193277147065845135561988641238516852487657117813536909482068950652 : <"babybear"> {product_source = "compute"} + %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 = felt.const 14731806221235869882801331463708736361296174006732553130708107037190460654379 : <"babybear"> {product_source = "compute"} + %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 = felt.const 2026733759645519472558796412979210009170379159866522399881566309631434814953 : <"babybear"> {product_source = "compute"} + %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 = felt.const 10484856914279112612610993418405543310546746652738541161791501150994088679557 : <"babybear"> {product_source = "compute"} + %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 = felt.const 32883284540320451295484135704808083452381176816565850047310272290579727564 : <"babybear"> {product_source = "compute"} + %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 = felt.const 2511432546938591792036639990606464315121646668029252285288323664350666551637 : <"babybear"> {product_source = "compute"} + %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 = felt.const 5007518659266430200134478928344522649876467369278722765097865662497773767152 : <"babybear"> {product_source = "compute"} + %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 = felt.const 1153669123397255702524721206511185557982017410156956216465120456256288427021 : <"babybear"> {product_source = "compute"} + %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 = felt.const 10810123816265612772922113403831964815724109728287572256602010709288980656498 : <"babybear"> {product_source = "compute"} + %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 = felt.const 1813584943682214789802230765734821149202472893379265320098816901270224589984 : <"babybear"> {product_source = "compute"} + %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 = felt.const 4923772847693564777744725640710197015181591950368494148029046443433103381621 : <"babybear"> {product_source = "compute"} + %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 = felt.const 21815578223768330433802113452339488275704145896544481092014911825656390567514 : <"babybear"> {product_source = "compute"} + %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 = felt.const 2016095394399807253596787752134573207202567875457560571095586743878953450738 : <"babybear"> {product_source = "compute"} + %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 = felt.const 10868453624107875516866146499877130701929063632959660262366632833504750028858 : <"babybear"> {product_source = "compute"} + %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 = felt.const 12200212977482648306758992405065921724409841940671166017620928947866825250857 : <"babybear"> {product_source = "compute"} + %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 = felt.const 176061952957067086877570020242717222844908281373122372938833890096257042779 : <"babybear"> {product_source = "compute"} + %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 = felt.const 8756385288462344550200229174435953103162307705310807828651304665320046782583 : <"babybear"> {product_source = "compute"} + %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 = felt.const 9607550223176946388146938069307456967842408600269548190739947540821716354749 : <"babybear"> {product_source = "compute"} + %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 = felt.const 11332046574800279729678603488745295198038913503395629790213378101166488244657 : <"babybear"> {product_source = "compute"} + %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 = felt.const 12771414330193951156383998390424063470766226667986423961689712557338777174205 : <"babybear"> {product_source = "compute"} + %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 = felt.const 18824274411769830274877839365728651108434404855803844568234862945613766611460 : <"babybear"> {product_source = "compute"} + %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 = felt.const 19001050671757720352890779127693793630251266879994702723636759889378387053056 : <"babybear"> {product_source = "compute"} + %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 = felt.const 148317947440800089795933930720822493695520852448386394775371401743494965187 : <"babybear"> {product_source = "compute"} + %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 = felt.const 7132325028834551397904855671244375895110341505383911719294705267624034122405 : <"babybear"> {product_source = "compute"} + %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 = felt.const 18725396114211370207078434315900726338547621160475533496863298091023511945076 : <"babybear"> {product_source = "compute"} + %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 = felt.const 16533189939837087893364000390641148516479148564190420358849587959161226782982 : <"babybear"> {product_source = "compute"} + %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 = felt.const 17784386835392322654196171115293700800825771210400152504776806618892170162248 : <"babybear"> {product_source = "compute"} + %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 = felt.const 10394369641533736715250242399198097296122982486516256408681925424076248952280 : <"babybear"> {product_source = "compute"} + %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 = felt.const 17213012626801210615058753489149961717422101711567228037597150941152495100640 : <"babybear"> {product_source = "compute"} + %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 = felt.const 8327443473179334761744301768309008451162322941906921742120510244986704677004 : <"babybear"> {product_source = "compute"} + %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 = felt.const 168282396747788514908709091757591226095443902501365500003618183905496160435 : <"babybear"> {product_source = "compute"} + %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 = felt.const 16390754464333401712265575949874369157699293840516802426621216808905079127650 : <"babybear"> {product_source = "compute"} + %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 = felt.const 8959562060028569701043973060670353733575345393653685776974948916988033453971 : <"babybear"> {product_source = "compute"} + %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 = felt.const 15618589556584434434009868216186115416835494805174158488636000580759692174228 : <"babybear"> {product_source = "compute"} + %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 = felt.const 916941639326869583414469202910306428966657806899788970948781207501251816730 : <"babybear"> {product_source = "compute"} + %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 = felt.const 13162342403579303950549728848130828093497701266240457479693991108217307949435 : <"babybear"> {product_source = "compute"} + %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 = felt.const 5363660674689121676875069134269386492382220935599781121306637800261912519729 : <"babybear"> {product_source = "compute"} + %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 = felt.const 12855514863299373699594410385788943772765811961581749194183533625311486462501 : <"babybear"> {product_source = "compute"} + %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 = felt.const 8837549193990558762776520822018694066937602576881497343584903902880277769302 : <"babybear"> {product_source = "compute"} + %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 = felt.const 5543749482491340532547407723464609328207990784853381797689466144924198391839 : <"babybear"> {product_source = "compute"} + %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 = felt.const 11760570435432189127645691249600821064883781677693087773459065574359292849137 : <"babybear"> {product_source = "compute"} + %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 = felt.const 2246692432011290582160062129070762007374502637007107318105405626910313810224 : <"babybear"> {product_source = "compute"} + %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 = felt.const 5203908808704813498389265425172875593837960384349653691918590736979872578408 : <"babybear"> {product_source = "compute"} + %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 = felt.const 6545064306297957002139416752334741502722251869537551068239642131448768236585 : <"babybear"> {product_source = "compute"} + %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 = felt.const 3113973447392053821824427670386252797811804954746053461397972968381571297505 : <"babybear"> {product_source = "compute"} + %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 = felt.const 11501810868606870391127866188394535330696206817602260610801897042898616817272 : <"babybear"> {product_source = "compute"} + %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 = felt.const 19346204940546791021518535594447257347218878114049998691060016493806845179755 : <"babybear"> {product_source = "compute"} + %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 = felt.const 7642160509228669138628515458941659189680509753651629476399516332224325757132 : <"babybear"> {product_source = "compute"} + %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 = felt.const 17198004293191777441573635123110935015228014028618868252989374962722329283022 : <"babybear"> {product_source = "compute"} + %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 = felt.const 3180973917010545328313139835982464870638521890385603025657430208141494469656 : <"babybear"> {product_source = "compute"} + %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 = felt.const 20196970640587451358539129330170636295243141659030208529338914906436009086943 : <"babybear"> {product_source = "compute"} + %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 = felt.const 153011722355526826233082383360057587249818749719433916258246100068258954737 : <"babybear"> {product_source = "compute"} + %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 = felt.const 2832093654883670345969792724123161241696170611611744759675180839473215203706 : <"babybear"> {product_source = "compute"} + %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 = felt.const 10165780782761211520836029617746977303303335603838343292431760011576528327409 : <"babybear"> {product_source = "compute"} + %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 = felt.const 20241898894740093733047052816576694435372877719072347814065227797906130857593 : <"babybear"> {product_source = "compute"} + %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 = felt.const 10858157235265583624235850660462324469799552996870780238992046963007491306222 : <"babybear"> {product_source = "compute"} + %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 = felt.const 6745410632962119604799318394592010194450845483518862700079921360015766217097 : <"babybear"> {product_source = "compute"} + %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 = felt.const 6302388219880227251325608388535181451187131054211388356563634768253301290116 : <"babybear"> {product_source = "compute"} + %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 = felt.const 1720059427972723034107765345743336447947522473310069975142483982753181038321 : <"babybear"> {product_source = "compute"} + %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 = felt.const 10097732913112662248360143041019433907849917041759137293018029019134392559350 : <"babybear"> {product_source = "compute"} + %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 = felt.const 4144769320246558352780591737261172907511489963810975650573703217887429086546 : <"babybear"> {product_source = "compute"} + %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 = felt.const 5521922218264623411380547905210139511350706092570900075727555783240701821773 : <"babybear"> {product_source = "compute"} + %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 = felt.const 19669450123472657781282985229369348220906547335081730205028099210442632534079 : <"babybear"> {product_source = "compute"} + %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 = felt.const 15189693413320228845990326214136820307649565437237093707846682797649429515840 : <"babybear"> {product_source = "compute"} + %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 = felt.const 18875020877782404439294079398043479420415331640996249745272087358069018086569 : <"babybear"> {product_source = "compute"} + %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 = felt.const 148924106504065664829055598316821983869409581623245780505601526786791681102 : <"babybear"> {product_source = "compute"} + %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 = felt.const 1888098689545151571063267806606510032698677328923740058080630641742325067877 : <"babybear"> {product_source = "compute"} + %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 = felt.const 2436445725746972287496138382764643208791713986676129260589667864467010129482 : <"babybear"> {product_source = "compute"} + %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 = felt.const 11878652861183667748838188993669912629573713271883125458838494308957689090959 : <"babybear"> {product_source = "compute"} + %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 = felt.const 16688277490485052681847773549197928630624828392248424077804829676011512392564 : <"babybear"> {product_source = "compute"} + %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 = felt.const 4622170486584704769521001011395820886029808520586507873417553166762370293671 : <"babybear"> {product_source = "compute"} + %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 = felt.const 16845753148201777192406958674202574751725237939980634861948953189320362207797 : <"babybear"> {product_source = "compute"} + %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 = felt.const 4623894483395123520243967718315330178025957095502546813929290333264120223168 : <"babybear"> {product_source = "compute"} + %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 = felt.const 5404287610364961067658660283245291234008692303120470305032076412056764726509 : <"babybear"> {product_source = "compute"} + %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 = felt.const 10796443006899450245502071131975731672911747129805343722228413358507805531141 : <"babybear"> {product_source = "compute"} + %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 = felt.const 8080173465267536232534446836148661251987053305394647905212781979099916615292 : <"babybear"> {product_source = "compute"} + %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 = felt.const 18146517657445423462330854383025300323335289319277199154920964274562014376193 : <"babybear"> {product_source = "compute"} + %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 = felt.const 20391289379084797414557439284689954098721219201171527383291525676334308303023 : <"babybear"> {product_source = "compute"} + %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 = felt.const 7556750851783822914673316211129907782679509728346361368978891584375551186255 : <"babybear"> {product_source = "compute"} + %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 = felt.const 3683645737503705042628598550438395339383572464204988015434959428676652575331 : <"babybear"> {product_source = "compute"} + %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 = felt.const 749264854018824809464168489785113337925400687349357088413132714480582918506 : <"babybear"> {product_source = "compute"} + %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 = felt.const 16771780563523793011283273687253985566177232886900511371656074413362142152543 : <"babybear"> {product_source = "compute"} + %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 = felt.const 11897542014760736209670863723231849628230383119798486487899539017466261308762 : <"babybear"> {product_source = "compute"} + %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 = felt.const 10005334761930299057035055370088813230849810566234116771751925093634136574742 : <"babybear"> {product_source = "compute"} + %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 = felt.const 17387238494588145257484818061490088963673275521250153686214197573695921400950 : <"babybear"> {product_source = "compute"} + %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 = felt.const 4798196928559910300796064665904583125427459076060519468052008159779219347957 : <"babybear"> {product_source = "compute"} + %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 = felt.const 9864183311657946807255900203841777810810224615118629957816193727554621093838 : <"babybear"> {product_source = "compute"} + %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 = felt.const 7207551498477838452286210989212982851118089401128156132319807392460388436957 : <"babybear"> {product_source = "compute"} + %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 = felt.const 7667462281466170157858259197976388676420847047604921256361474169980037581876 : <"babybear"> {product_source = "compute"} + %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 = felt.const 18162138253399958831050545255414688239130588254891200470934232514682584734511 : <"babybear"> {product_source = "compute"} + %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 = felt.const 1213715278223786725806155661738676903520350859678319590331207960381534602599 : <"babybear"> {product_source = "compute"} + %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 = felt.const 19886576439381707240399940949310933992335779767309383709787331470398675714258 : <"babybear"> {product_source = "compute"} + %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 = felt.const 17980351014018068290387269214713820287804403312720763401943303895585469787384 : <"babybear"> {product_source = "compute"} + %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 = felt.const 5024705281721889198577876690145313457398658950011302225525409148828000436681 : <"babybear"> {product_source = "compute"} + %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 = felt.const 7120861356467848435263064379192047478074060781135320967663101236819528304084 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !felt.type<"babybear"> {product_source = "compute"} + %nondet_1 = llzk.nondet : !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_2 = llzk.nondet : !felt.type<"babybear"> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<218 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c3] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c4] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c5] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c6] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c7] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c8] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c9] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c10] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c11] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c12] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c13] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c14] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c15] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c16] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c17] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c18] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c19] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c20] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c21] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c22] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c23] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c24] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c25] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c26] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c27] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c28] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c29] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c30] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c31] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c32] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c33] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c34] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c35] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c36] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c37] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c38] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c39] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c40] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c41] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c42] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c43] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c44] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c45] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c46] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c47] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c48] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c49] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c50] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c51] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c52] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c53] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c54] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c55] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c56] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c57] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c58] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c59] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c60] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c61] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c62] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c64] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c65] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c66] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c67] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c68] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c69] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c70] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c71] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c72] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c73] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c74] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c75] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c76] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c77] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c78] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c79] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c80] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c81] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c82] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c83] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c84] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c85] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c86] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c87] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c88] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c89] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c90] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c91] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c92] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c93] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c94] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c95] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c96] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c97] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c98] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c99] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c100] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c101] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c102] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c103] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c104] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c105] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c106] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c107] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c108] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c109] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c110] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c111] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c112] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c113] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c114] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c115] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c116] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c117] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c118] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c119] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c120] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c121] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c122] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c123] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c124] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c125] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c126] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c127] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c128] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c129] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c130] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c131] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c132] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c133] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c134] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c135] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c136] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c137] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c138] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c139] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c140] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c141] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c142] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c143] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c144] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c145] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c146] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c147] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c148] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c149] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c150] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c151] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c152] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c153] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c154] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c155] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c156] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c157] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c158] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c159] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c160] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c161] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c162] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c163] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c164] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c165] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c166] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c167] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c168] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c169] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c170] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c171] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c172] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c173] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c174] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c175] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c176] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c177] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c178] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c179] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c180] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c181] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c182] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c183] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c184] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c185] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c186] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c187] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c188] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c189] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c190] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c191] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c192] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c193] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c194] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c195] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c196] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c197] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c198] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c199] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c200] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c201] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c202] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c203] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c204] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c205] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c206] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c207] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c208] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c209] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c210] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c211] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c212] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c213] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c214] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c215] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c216] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c217] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c3] = %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c4] = %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c5] = %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c6] = %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c7] = %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c8] = %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c9] = %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c10] = %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c11] = %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c12] = %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c13] = %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c14] = %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c15] = %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c16] = %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c17] = %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c18] = %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c19] = %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c20] = %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c21] = %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c22] = %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c23] = %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c24] = %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c25] = %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c26] = %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c27] = %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c28] = %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c29] = %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c30] = %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c31] = %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c32] = %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c33] = %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c34] = %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c35] = %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c36] = %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c37] = %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c38] = %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c39] = %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c40] = %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c41] = %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c42] = %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c43] = %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c44] = %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c45] = %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c46] = %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c47] = %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c48] = %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c49] = %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c50] = %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c51] = %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c52] = %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c53] = %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c54] = %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c55] = %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c56] = %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c57] = %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c58] = %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c59] = %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c60] = %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c61] = %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c62] = %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c64] = %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c65] = %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c66] = %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c67] = %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c68] = %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c69] = %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c70] = %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c71] = %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c72] = %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c73] = %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c74] = %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c75] = %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c76] = %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c77] = %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c78] = %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c79] = %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c80] = %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c81] = %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c82] = %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c83] = %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c84] = %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c85] = %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c86] = %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c87] = %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c88] = %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c89] = %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c90] = %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c91] = %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c92] = %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c93] = %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c94] = %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c95] = %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c96] = %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c97] = %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c98] = %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c99] = %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c100] = %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c101] = %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c102] = %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c103] = %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c104] = %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c105] = %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c106] = %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c107] = %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c108] = %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c109] = %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c110] = %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c111] = %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c112] = %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c113] = %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c114] = %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c115] = %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c116] = %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c117] = %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c118] = %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c119] = %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c120] = %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c121] = %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c122] = %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c123] = %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c124] = %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c125] = %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c126] = %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c127] = %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c128] = %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c129] = %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c130] = %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c131] = %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c132] = %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c133] = %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c134] = %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c135] = %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c136] = %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c137] = %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c138] = %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c139] = %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c140] = %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c141] = %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c142] = %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c143] = %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c144] = %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c145] = %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c146] = %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c147] = %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c148] = %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c149] = %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c150] = %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c151] = %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c152] = %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c153] = %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c154] = %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c155] = %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c156] = %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c157] = %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c158] = %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c159] = %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c160] = %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c161] = %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c162] = %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c163] = %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c164] = %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c165] = %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c166] = %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c167] = %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c168] = %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c169] = %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c170] = %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c171] = %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c172] = %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c173] = %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c174] = %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c175] = %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c176] = %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c177] = %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c178] = %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c179] = %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c180] = %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c181] = %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c182] = %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c183] = %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c184] = %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c185] = %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c186] = %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c187] = %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c188] = %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c189] = %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c190] = %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c191] = %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c192] = %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c193] = %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c194] = %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c195] = %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c196] = %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c197] = %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c198] = %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c199] = %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c200] = %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c201] = %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c202] = %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c203] = %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c204] = %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c205] = %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c206] = %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c207] = %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c208] = %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c209] = %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c210] = %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c211] = %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c212] = %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c213] = %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c214] = %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c215] = %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c216] = %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c217] = %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@t2] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@t4] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@xL] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@xR] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_6 = llzk.nondet : !array.type<218 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_6[%c0] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c1] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c2] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c3] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c4] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c5] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c6] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c7] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c8] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c9] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c10] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c11] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c12] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c13] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c14] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c15] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c16] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c17] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c18] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c19] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c20] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c21] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c22] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c23] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c24] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c25] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c26] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c27] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c28] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c29] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c30] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c31] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c32] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c33] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c34] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c35] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c36] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c37] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c38] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c39] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c40] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c41] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c42] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c43] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c44] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c45] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c46] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c47] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c48] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c49] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c50] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c51] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c52] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c53] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c54] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c55] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c56] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c57] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c58] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c59] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c60] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c61] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c62] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c63] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c64] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c65] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c66] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c67] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c68] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c69] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c70] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c71] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c72] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c73] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c74] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c75] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c76] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c77] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c78] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c79] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c80] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c81] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c82] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c83] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c84] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c85] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c86] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c87] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c88] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c89] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c90] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c91] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c92] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c93] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c94] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c95] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c96] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c97] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c98] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c99] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c100] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c101] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c102] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c103] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c104] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c105] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c106] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c107] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c108] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c109] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c110] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c111] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c112] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c113] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c114] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c115] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c116] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c117] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c118] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c119] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c120] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c121] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c122] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c123] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c124] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c125] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c126] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c127] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c128] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c129] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c130] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c131] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c132] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c133] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c134] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c135] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c136] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c137] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c138] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c139] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c140] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c141] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c142] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c143] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c144] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c145] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c146] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c147] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c148] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c149] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c150] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c151] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c152] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c153] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c154] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c155] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c156] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c157] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c158] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c159] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c160] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c161] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c162] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c163] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c164] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c165] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c166] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c167] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c168] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c169] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c170] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c171] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c172] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c173] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c174] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c175] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c176] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c177] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c178] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c179] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c180] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c181] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c182] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c183] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c184] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c185] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c186] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c187] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c188] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c189] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c190] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c191] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c192] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c193] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c194] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c195] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c196] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c197] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c198] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c199] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c200] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c201] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c202] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c203] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c204] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c205] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c206] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c207] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c208] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c209] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c210] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c211] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c212] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c213] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c214] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c215] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c216] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c217] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c0] = %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c1] = %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c2] = %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c3] = %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c4] = %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c5] = %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c6] = %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c7] = %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c8] = %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c9] = %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c10] = %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c11] = %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c12] = %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c13] = %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c14] = %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c15] = %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c16] = %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c17] = %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c18] = %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c19] = %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c20] = %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c21] = %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c22] = %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c23] = %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c24] = %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c25] = %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c26] = %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c27] = %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c28] = %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c29] = %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c30] = %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c31] = %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c32] = %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c33] = %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c34] = %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c35] = %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c36] = %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c37] = %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c38] = %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c39] = %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c40] = %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c41] = %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c42] = %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c43] = %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c44] = %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c45] = %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c46] = %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c47] = %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c48] = %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c49] = %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c50] = %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c51] = %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c52] = %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c53] = %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c54] = %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c55] = %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c56] = %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c57] = %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c58] = %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c59] = %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c60] = %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c61] = %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c62] = %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c63] = %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c64] = %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c65] = %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c66] = %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c67] = %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c68] = %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c69] = %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c70] = %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c71] = %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c72] = %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c73] = %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c74] = %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c75] = %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c76] = %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c77] = %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c78] = %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c79] = %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c80] = %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c81] = %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c82] = %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c83] = %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c84] = %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c85] = %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c86] = %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c87] = %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c88] = %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c89] = %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c90] = %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c91] = %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c92] = %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c93] = %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c94] = %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c95] = %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c96] = %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c97] = %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c98] = %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c99] = %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c100] = %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c101] = %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c102] = %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c103] = %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c104] = %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c105] = %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c106] = %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c107] = %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c108] = %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c109] = %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c110] = %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c111] = %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c112] = %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c113] = %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c114] = %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c115] = %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c116] = %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c117] = %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c118] = %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c119] = %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c120] = %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c121] = %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c122] = %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c123] = %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c124] = %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c125] = %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c126] = %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c127] = %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c128] = %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c129] = %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c130] = %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c131] = %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c132] = %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c133] = %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c134] = %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c135] = %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c136] = %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c137] = %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c138] = %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c139] = %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c140] = %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c141] = %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c142] = %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c143] = %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c144] = %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c145] = %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c146] = %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c147] = %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c148] = %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c149] = %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c150] = %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c151] = %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c152] = %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c153] = %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c154] = %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c155] = %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c156] = %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c157] = %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c158] = %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c159] = %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c160] = %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c161] = %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c162] = %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c163] = %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c164] = %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c165] = %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c166] = %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c167] = %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c168] = %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c169] = %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c170] = %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c171] = %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c172] = %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c173] = %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c174] = %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c175] = %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c176] = %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c177] = %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c178] = %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c179] = %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c180] = %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c181] = %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c182] = %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c183] = %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c184] = %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c185] = %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c186] = %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c187] = %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c188] = %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c189] = %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c190] = %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c191] = %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c192] = %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c193] = %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c194] = %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c195] = %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c196] = %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c197] = %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c198] = %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c199] = %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c200] = %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c201] = %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c202] = %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c203] = %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c204] = %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c205] = %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c206] = %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c207] = %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c208] = %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c209] = %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c210] = %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c211] = %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c212] = %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c213] = %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c214] = %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c215] = %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c216] = %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_6[%c217] = %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6:2 = scf.for %arg3 = %c0 to %c220 step %c1 iter_args(%arg4 = %nondet_2, %arg5 = %nondet_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = bool.cmp eq(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = bool.cmp eq(%7, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = bool.or %8, %9 : i1, i1 {product_source = "compute"} + %11 = scf.if %10 -> (!felt.type<"babybear">) { + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } else { + %42 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %nondet_5[%43] : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %44 : !felt.type<"babybear"> + } {product_source = "compute"} + %12 = bool.cmp eq(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = scf.if %12 -> (!felt.type<"babybear">) { + %42 = felt.add %arg2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %42 : !felt.type<"babybear"> + } else { + %42 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %nondet[%43] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %arg2, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %45, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %46 : !felt.type<"babybear"> + } {product_source = "compute"} + %14 = felt.mul %13, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%15] = %14 : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet_3[%16] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet_3[%18] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %17, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%21] = %20 : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = bool.cmp lt(%7, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23:2 = scf.if %22 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %42 = bool.cmp eq(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = scf.if %42 -> (!felt.type<"babybear">) { + scf.yield {product_source = "compute"} %arg1 : !felt.type<"babybear"> + } else { + %50 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %nondet_1[%51] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %52 : !felt.type<"babybear"> + } {product_source = "compute"} + %44 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet_4[%44] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %43, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%48] = %47 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = bool.cmp eq(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %49 { + %50 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%50] = %arg0 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %50 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %nondet[%51] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%53] = %52 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.yield {product_source = "compute"} %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %42 = array.read %nondet_1[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %nondet_4[%c219] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %42, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@xRout] = %45 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %nondet[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@xLout] = %46 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %46, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %24 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%24, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%24, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.or %25, %26 : i1, i1 {product_source = "constrain"} + %28 = scf.if %27 -> (!felt.type<"babybear">) { + scf.yield {product_source = "constrain"} %felt_const_0 : !felt.type<"babybear"> + } else { + %42 = felt.sub %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %nondet_6[%43] : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %44 : !felt.type<"babybear"> + } {product_source = "constrain"} + %29 = bool.cmp eq(%24, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = scf.if %29 -> (!felt.type<"babybear">) { + %42 = felt.add %arg2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %42 : !felt.type<"babybear"> + } else { + %42 = felt.sub %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %4[%43] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %arg2, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %46 : !felt.type<"babybear"> + } {product_source = "constrain"} + %31 = felt.mul %30, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %2[%32] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %2[%34] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %2[%36] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %35, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %3[%39] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = bool.cmp lt(%24, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %41 { + %42 = bool.cmp eq(%24, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = scf.if %42 -> (!felt.type<"babybear">) { + scf.yield {product_source = "constrain"} %arg1 : !felt.type<"babybear"> + } else { + %51 = felt.sub %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %5[%52] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %53 : !felt.type<"babybear"> + } {product_source = "constrain"} + %44 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %3[%44] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %43, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %4[%48] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = bool.cmp eq(%24, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %50 { + %51 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %5[%51] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %51 = felt.sub %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %4[%52] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %5[%54] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } else { + %42 = array.read %5[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %3[%c219] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %42, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %4[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.yield %23#0, %23#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@t2] = %nondet_3 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t4] = %nondet_4 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@xL] = %nondet : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@xR] = %nondet_1 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c220 = arith.constant 220 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_219 = felt.const 219 : <"babybear"> {product_source = "compute"} + %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 = felt.const 2119542016932434047340813757208803962484943912710204325088879681995922344971 : <"babybear"> {product_source = "compute"} + %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 = felt.const 11050822248291117548220126630860474473945266276626263036056336623671308219529 : <"babybear"> {product_source = "compute"} + %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 = felt.const 274945154732293792784580363548970818611304339008964723447672490026510689427 : <"babybear"> {product_source = "compute"} + %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 = felt.const 18224457394066545825553407391290108485121649197258948320896164404518684305122 : <"babybear"> {product_source = "compute"} + %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 = felt.const 14227467863135365427954093998621993651369686288941275436795622973781503444257 : <"babybear"> {product_source = "compute"} + %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 = felt.const 16085392195894691829567913404182676871326863890140775376809129785155092531260 : <"babybear"> {product_source = "compute"} + %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 = felt.const 5628039096440332922248578319648483863204530861778160259559031331287721255522 : <"babybear"> {product_source = "compute"} + %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 = felt.const 15162538063742142685306302282127534305212832649282186184583465569986719234456 : <"babybear"> {product_source = "compute"} + %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 = felt.const 2273205422216987330510475127669563545720586464429614439716564154166712854048 : <"babybear"> {product_source = "compute"} + %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 = felt.const 7400481189785154329569470986896455371037813715804007747228648863919991399081 : <"babybear"> {product_source = "compute"} + %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 = felt.const 16641596134749940573104316021365063031319260205559553673368334842484345864859 : <"babybear"> {product_source = "compute"} + %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 = felt.const 17297554111853491139852678417579991271009602631577069694853813331124433680030 : <"babybear"> {product_source = "compute"} + %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 = felt.const 6936272626871035740815028148058841877090860312517423346335878088297448888663 : <"babybear"> {product_source = "compute"} + %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 = felt.const 12732823292801537626009139514048596316076834307941224506504666470961250728055 : <"babybear"> {product_source = "compute"} + %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 = felt.const 6842203153996907264167856337497139692895299874139131328642472698663046726780 : <"babybear"> {product_source = "compute"} + %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 = felt.const 15117544653571553820496948522381772148324367479772362833334593000535648316185 : <"babybear"> {product_source = "compute"} + %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 = felt.const 6479667912792222539919362076122453947926362746906450079329453150607427372979 : <"babybear"> {product_source = "compute"} + %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 = felt.const 10702811721859145441471328511968332847175733707711670171718794132331147396634 : <"babybear"> {product_source = "compute"} + %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 = felt.const 12216779172735125538689875667307129262237123728082657485828359100719208190116 : <"babybear"> {product_source = "compute"} + %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 = felt.const 9244680976345080074252591214216060854998619670381671198295645618515047080988 : <"babybear"> {product_source = "compute"} + %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 = felt.const 8242601581342441750402731523736202888792436665415852106196418942315563860366 : <"babybear"> {product_source = "compute"} + %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 = felt.const 14016139747289624978792446847000951708158212463304817001882956166752906714332 : <"babybear"> {product_source = "compute"} + %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 = felt.const 17566185590731088197064706533119299946752127014428399631467913813769853431107 : <"babybear"> {product_source = "compute"} + %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 = felt.const 10814026414212439999107945133852431304483604215416531759535467355316227331774 : <"babybear"> {product_source = "compute"} + %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 = felt.const 11498264615058604317482574216318586415670903094838791165247179252175768794889 : <"babybear"> {product_source = "compute"} + %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 = felt.const 18664315914479294273286016871365663486061896605232511201418576829062292269769 : <"babybear"> {product_source = "compute"} + %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 = felt.const 19212515502973904821995111796203064175854996071497099383090983975618035391558 : <"babybear"> {product_source = "compute"} + %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 = felt.const 6614652990340435611114076169697104582524566019034036680161902142028967568142 : <"babybear"> {product_source = "compute"} + %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 = felt.const 8653175945487997845203439345797943132543211416447757110963967501177317426221 : <"babybear"> {product_source = "compute"} + %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 = felt.const 3819598418157732134449049289585680301176983019643974929528867686268702720163 : <"babybear"> {product_source = "compute"} + %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 = felt.const 1258781501221760320019859066036073675029057285507345332959539295621677296991 : <"babybear"> {product_source = "compute"} + %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 = felt.const 21578580340755653236050830649990190843552802306886938815497471545814130084980 : <"babybear"> {product_source = "compute"} + %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 = felt.const 15092262360719700162343163278648422751610766427236295023221516498310468956361 : <"babybear"> {product_source = "compute"} + %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 = felt.const 2929658084700714257515872921366736697080475676508114973627124569375444665664 : <"babybear"> {product_source = "compute"} + %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 = felt.const 19914849528178967155534624144358541535306360577227460456855821557421213606310 : <"babybear"> {product_source = "compute"} + %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 = felt.const 17047263688548829001253658727764731047114098556534482052135734487985276987385 : <"babybear"> {product_source = "compute"} + %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 = felt.const 19187314764836593118404597958543112407224947638377479622725713735224279297009 : <"babybear"> {product_source = "compute"} + %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 = felt.const 11028094245762332275225364962905938096659249161369092798505554939952525894293 : <"babybear"> {product_source = "compute"} + %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 = felt.const 5542499997310181530432302492142574333860449305424174466698068685590909336771 : <"babybear"> {product_source = "compute"} + %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 = felt.const 1205448543652932944633962232545707633928124666868453915721030884663332604536 : <"babybear"> {product_source = "compute"} + %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 = felt.const 5300440870136391278944213332144327695659161151625757537632832724102670898756 : <"babybear"> {product_source = "compute"} + %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 = felt.const 8777887112076272395250620301071581171386440850451972412060638225741125310886 : <"babybear"> {product_source = "compute"} + %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 = felt.const 5100105771517691442278432864090229416166996183792075307747582375962855820797 : <"babybear"> {product_source = "compute"} + %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 = felt.const 20871081766843466343749609089986071784031203517506781251203251608363835140622 : <"babybear"> {product_source = "compute"} + %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 = felt.const 19871836214837460419845806980869387567383718044439891735114283113359312279540 : <"babybear"> {product_source = "compute"} + %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 = felt.const 10796631184889302076168355684722130903785890709107732067446714470783437829037 : <"babybear"> {product_source = "compute"} + %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 = felt.const 6506225705710197163670556961299945987488979904603689017479840649664564978574 : <"babybear"> {product_source = "compute"} + %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 = felt.const 15016165746156232864069722572047169071786333815661109750860165034341572904221 : <"babybear"> {product_source = "compute"} + %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 = felt.const 15550788416669474113213749561488122552422887538676036667630838378023479382689 : <"babybear"> {product_source = "compute"} + %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 = felt.const 9783723818270121678386992630754842961728702994964214799008457449989291229500 : <"babybear"> {product_source = "compute"} + %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 = felt.const 19012287860122586147374214541764572282814469237161122489573881644994964647218 : <"babybear"> {product_source = "compute"} + %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 = felt.const 9558393272910366944245875920138649617479779893610128634419086981339060613250 : <"babybear"> {product_source = "compute"} + %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 = felt.const 8673089750662709235894359384294076697329948991010184356091130382437645649279 : <"babybear"> {product_source = "compute"} + %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 = felt.const 10493603554686607050979497281838644324893776154179810893893660722522945589063 : <"babybear"> {product_source = "compute"} + %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 = felt.const 9277135875276787021836189566799935097400042171346561246305113339462708861695 : <"babybear"> {product_source = "compute"} + %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 = felt.const 6252650284989960032925831409804233477770646333900692286731621844532438095656 : <"babybear"> {product_source = "compute"} + %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 = felt.const 16101132301514338989512946061786320637179843435886825102406248183507106312877 : <"babybear"> {product_source = "compute"} + %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 = felt.const 2494806857395134874309386694756263421445039103814920780777601708371037591569 : <"babybear"> {product_source = "compute"} + %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 = felt.const 12368712287081330853637674140264759478736012797026621876924395982504369598764 : <"babybear"> {product_source = "compute"} + %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 = felt.const 814913922521637742587885320797606426167962526342166512693085292151314976633 : <"babybear"> {product_source = "compute"} + %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 = felt.const 438123800976401478772659663183448617575635636575786782566035096946820525816 : <"babybear"> {product_source = "compute"} + %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 = felt.const 7733050956302327984762132317027414325566202380840692458138724610131603812560 : <"babybear"> {product_source = "compute"} + %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 = felt.const 15895485136902450169492923978042129726601461603404514670348703312850236146328 : <"babybear"> {product_source = "compute"} + %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 = felt.const 21280039024501430842616328642522421302481259067470872421086939673482530783142 : <"babybear"> {product_source = "compute"} + %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 = felt.const 3667030990325966886479548860429670833692690972701471494757671819017808678584 : <"babybear"> {product_source = "compute"} + %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 = felt.const 16690275395485630428127725067513114066329712673106153451801968992299636791385 : <"babybear"> {product_source = "compute"} + %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 = felt.const 14222898219492484180162096141564251903058269177856173968147960855133048449557 : <"babybear"> {product_source = "compute"} + %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 = felt.const 15566927854306879444693061574322104423426072650522411176731130806720753591030 : <"babybear"> {product_source = "compute"} + %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 = felt.const 11272653598912269895509621181205395118899451234151664604248382803490621227687 : <"babybear"> {product_source = "compute"} + %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 = felt.const 397690828254561723549349897112473766901585444153303054845160673059519614409 : <"babybear"> {product_source = "compute"} + %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 = felt.const 16143265650645676880461646123844627780378251900510645261875867423498913438066 : <"babybear"> {product_source = "compute"} + %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 = felt.const 4947482739415078212217504789923078546034438919537985740403824517728200332286 : <"babybear"> {product_source = "compute"} + %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 = felt.const 5894928453677122829055071981254202951712129328678534592916926069506935491729 : <"babybear"> {product_source = "compute"} + %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 = felt.const 16062117410185840274616925297332331018523844434907012275592638570193234893570 : <"babybear"> {product_source = "compute"} + %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 = felt.const 2204224910006646535594933495262085193210692406133533679934843341237521233504 : <"babybear"> {product_source = "compute"} + %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 = felt.const 2492729278659146790410698334997955258248120870028541691998279257260289595548 : <"babybear"> {product_source = "compute"} + %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 = felt.const 146494141603558321291767829522948454429758543710648402457451799015963102253 : <"babybear"> {product_source = "compute"} + %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 = felt.const 16901065971871379877929280081392692752968612240624985552337779093292740763381 : <"babybear"> {product_source = "compute"} + %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 = felt.const 18230936781133176044598070768084230333433368654744509969087239465125979720995 : <"babybear"> {product_source = "compute"} + %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 = felt.const 10780807212297131186617505517708903709488273075252405602261683478333331220733 : <"babybear"> {product_source = "compute"} + %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 = felt.const 19171031072692942278056619599721228021635671304612437350119663236604712493093 : <"babybear"> {product_source = "compute"} + %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 = felt.const 2825393571154632139467378429077438870179957021959813965940638905853993971879 : <"babybear"> {product_source = "compute"} + %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 = felt.const 4221265384902749246920810956363310125115516771964522748896154428740238579824 : <"babybear"> {product_source = "compute"} + %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 = felt.const 1888195070251580606973417065636430294417895423429240431595054184472931224452 : <"babybear"> {product_source = "compute"} + %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 = felt.const 1022951765127126818581466247360193856197472064872288389992480993218645055345 : <"babybear"> {product_source = "compute"} + %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 = felt.const 8677548159358013363291014307402600830078662555833653517843708051504582990832 : <"babybear"> {product_source = "compute"} + %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 = felt.const 4467191506765339364971058668792642195242197133011672559453028147641428433293 : <"babybear"> {product_source = "compute"} + %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 = felt.const 16729368143229828574342820060716366330476985824952922184463387490091156065099 : <"babybear"> {product_source = "compute"} + %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 = felt.const 21297149835078365363970699581821844234354988617890041296044775371855432973500 : <"babybear"> {product_source = "compute"} + %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 = felt.const 10090204501612803176317709245679152331057882187411777688746797044706063410969 : <"babybear"> {product_source = "compute"} + %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 = felt.const 248732676202643792226973868626360612151424823368345645514532870586234380100 : <"babybear"> {product_source = "compute"} + %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 = felt.const 3506345610354615013737144848471391553141006285964325596214723571988011984829 : <"babybear"> {product_source = "compute"} + %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 = felt.const 18364168158495573675698600238443218434246806358811328083953887470513967121206 : <"babybear"> {product_source = "compute"} + %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 = felt.const 4993662582188632374202316265508850988596880036291765531885657575099537176757 : <"babybear"> {product_source = "compute"} + %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 = felt.const 6678298831065390834922566306988418588227382406175769592902974103663687992230 : <"babybear"> {product_source = "compute"} + %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 = felt.const 10761027113757988230637066281488532903174559953630210849190212601991063767647 : <"babybear"> {product_source = "compute"} + %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 = felt.const 21171984405852590343970239018692870799717057961108910523876770029017785940991 : <"babybear"> {product_source = "compute"} + %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 = felt.const 21345603324471810861925019445720576814602636473739003852898308205213912255830 : <"babybear"> {product_source = "compute"} + %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 = felt.const 8465768840047024550750516678171433288207841931251654898809033371655109266663 : <"babybear"> {product_source = "compute"} + %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 = felt.const 16395063164993626722686882727042150241125309409717445381854913964674649318585 : <"babybear"> {product_source = "compute"} + %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 = felt.const 13973538843621261113924259058427434053808430378163734641175100160836376897004 : <"babybear"> {product_source = "compute"} + %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 = felt.const 14595204575654316237672764823862241845410365278802914304953002937313300553572 : <"babybear"> {product_source = "compute"} + %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 = felt.const 5027602491523497423798779154966735896562099398367163998686335127580757861872 : <"babybear"> {product_source = "compute"} + %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 = felt.const 792781492853909872425531014397300057232399608769451037135936617996830018501 : <"babybear"> {product_source = "compute"} + %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 = felt.const 20977948360215259915441258687649465618185769343138135384346964466965010873779 : <"babybear"> {product_source = "compute"} + %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 = felt.const 11311085442652291634822798307831431035776248927202286895207125867542470350078 : <"babybear"> {product_source = "compute"} + %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 = felt.const 6574066859860991369704567902211886840188702386542112593710271426704432301235 : <"babybear"> {product_source = "compute"} + %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 = felt.const 11246573086260753259993971254725613211193686683988426513880826148090811891866 : <"babybear"> {product_source = "compute"} + %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 = felt.const 10142447197759703415402259672441315777933858467700579946665223821199077641122 : <"babybear"> {product_source = "compute"} + %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 = felt.const 15487549757142039139328911515400805508248576685795694919457041092150651939253 : <"babybear"> {product_source = "compute"} + %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 = felt.const 18192064100315141084242006659317257023098826945893371479835220462302399655674 : <"babybear"> {product_source = "compute"} + %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 = felt.const 214219368547551689972421167733597094823289857206402800635962137077096090722 : <"babybear"> {product_source = "compute"} + %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 = felt.const 2391801327305361293476178683853802679507598622000359948432171562543560193350 : <"babybear"> {product_source = "compute"} + %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 = felt.const 4365864398105436789177703571412645548020537580493599380018290523813331678900 : <"babybear"> {product_source = "compute"} + %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 = felt.const 3981753758468103976812813304477670033098707002886030847251581853700311567551 : <"babybear"> {product_source = "compute"} + %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 = felt.const 10041051776251223165849354194892664881051125330236567356945669006147134614302 : <"babybear"> {product_source = "compute"} + %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 = felt.const 1571520786233540988201616650622796363168031165456869481368085474420849243232 : <"babybear"> {product_source = "compute"} + %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 = felt.const 17467794879902895769410571945152708684493991588672014763135370927880883292655 : <"babybear"> {product_source = "compute"} + %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 = felt.const 2821730726367472966906149684046356272806484545281639696873240305052362149654 : <"babybear"> {product_source = "compute"} + %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 = felt.const 11061717085931490100602849654034280576915102867237101935487893025907907250695 : <"babybear"> {product_source = "compute"} + %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 = felt.const 16709604795697901641948603019242067672006293290826991671766611326262532802914 : <"babybear"> {product_source = "compute"} + %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 = felt.const 3804047064713122820157099453648459188816376755739202017447862327783289895072 : <"babybear"> {product_source = "compute"} + %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 = felt.const 18787428285295558781869865751953016580493190547148386433580291216673009884554 : <"babybear"> {product_source = "compute"} + %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 = felt.const 14740327483193277147065845135561988641238516852487657117813536909482068950652 : <"babybear"> {product_source = "compute"} + %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 = felt.const 14731806221235869882801331463708736361296174006732553130708107037190460654379 : <"babybear"> {product_source = "compute"} + %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 = felt.const 2026733759645519472558796412979210009170379159866522399881566309631434814953 : <"babybear"> {product_source = "compute"} + %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 = felt.const 10484856914279112612610993418405543310546746652738541161791501150994088679557 : <"babybear"> {product_source = "compute"} + %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 = felt.const 32883284540320451295484135704808083452381176816565850047310272290579727564 : <"babybear"> {product_source = "compute"} + %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 = felt.const 2511432546938591792036639990606464315121646668029252285288323664350666551637 : <"babybear"> {product_source = "compute"} + %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 = felt.const 5007518659266430200134478928344522649876467369278722765097865662497773767152 : <"babybear"> {product_source = "compute"} + %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 = felt.const 1153669123397255702524721206511185557982017410156956216465120456256288427021 : <"babybear"> {product_source = "compute"} + %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 = felt.const 10810123816265612772922113403831964815724109728287572256602010709288980656498 : <"babybear"> {product_source = "compute"} + %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 = felt.const 1813584943682214789802230765734821149202472893379265320098816901270224589984 : <"babybear"> {product_source = "compute"} + %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 = felt.const 4923772847693564777744725640710197015181591950368494148029046443433103381621 : <"babybear"> {product_source = "compute"} + %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 = felt.const 21815578223768330433802113452339488275704145896544481092014911825656390567514 : <"babybear"> {product_source = "compute"} + %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 = felt.const 2016095394399807253596787752134573207202567875457560571095586743878953450738 : <"babybear"> {product_source = "compute"} + %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 = felt.const 10868453624107875516866146499877130701929063632959660262366632833504750028858 : <"babybear"> {product_source = "compute"} + %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 = felt.const 12200212977482648306758992405065921724409841940671166017620928947866825250857 : <"babybear"> {product_source = "compute"} + %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 = felt.const 176061952957067086877570020242717222844908281373122372938833890096257042779 : <"babybear"> {product_source = "compute"} + %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 = felt.const 8756385288462344550200229174435953103162307705310807828651304665320046782583 : <"babybear"> {product_source = "compute"} + %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 = felt.const 9607550223176946388146938069307456967842408600269548190739947540821716354749 : <"babybear"> {product_source = "compute"} + %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 = felt.const 11332046574800279729678603488745295198038913503395629790213378101166488244657 : <"babybear"> {product_source = "compute"} + %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 = felt.const 12771414330193951156383998390424063470766226667986423961689712557338777174205 : <"babybear"> {product_source = "compute"} + %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 = felt.const 18824274411769830274877839365728651108434404855803844568234862945613766611460 : <"babybear"> {product_source = "compute"} + %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 = felt.const 19001050671757720352890779127693793630251266879994702723636759889378387053056 : <"babybear"> {product_source = "compute"} + %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 = felt.const 148317947440800089795933930720822493695520852448386394775371401743494965187 : <"babybear"> {product_source = "compute"} + %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 = felt.const 7132325028834551397904855671244375895110341505383911719294705267624034122405 : <"babybear"> {product_source = "compute"} + %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 = felt.const 18725396114211370207078434315900726338547621160475533496863298091023511945076 : <"babybear"> {product_source = "compute"} + %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 = felt.const 16533189939837087893364000390641148516479148564190420358849587959161226782982 : <"babybear"> {product_source = "compute"} + %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 = felt.const 17784386835392322654196171115293700800825771210400152504776806618892170162248 : <"babybear"> {product_source = "compute"} + %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 = felt.const 10394369641533736715250242399198097296122982486516256408681925424076248952280 : <"babybear"> {product_source = "compute"} + %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 = felt.const 17213012626801210615058753489149961717422101711567228037597150941152495100640 : <"babybear"> {product_source = "compute"} + %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 = felt.const 8327443473179334761744301768309008451162322941906921742120510244986704677004 : <"babybear"> {product_source = "compute"} + %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 = felt.const 168282396747788514908709091757591226095443902501365500003618183905496160435 : <"babybear"> {product_source = "compute"} + %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 = felt.const 16390754464333401712265575949874369157699293840516802426621216808905079127650 : <"babybear"> {product_source = "compute"} + %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 = felt.const 8959562060028569701043973060670353733575345393653685776974948916988033453971 : <"babybear"> {product_source = "compute"} + %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 = felt.const 15618589556584434434009868216186115416835494805174158488636000580759692174228 : <"babybear"> {product_source = "compute"} + %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 = felt.const 916941639326869583414469202910306428966657806899788970948781207501251816730 : <"babybear"> {product_source = "compute"} + %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 = felt.const 13162342403579303950549728848130828093497701266240457479693991108217307949435 : <"babybear"> {product_source = "compute"} + %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 = felt.const 5363660674689121676875069134269386492382220935599781121306637800261912519729 : <"babybear"> {product_source = "compute"} + %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 = felt.const 12855514863299373699594410385788943772765811961581749194183533625311486462501 : <"babybear"> {product_source = "compute"} + %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 = felt.const 8837549193990558762776520822018694066937602576881497343584903902880277769302 : <"babybear"> {product_source = "compute"} + %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 = felt.const 5543749482491340532547407723464609328207990784853381797689466144924198391839 : <"babybear"> {product_source = "compute"} + %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 = felt.const 11760570435432189127645691249600821064883781677693087773459065574359292849137 : <"babybear"> {product_source = "compute"} + %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 = felt.const 2246692432011290582160062129070762007374502637007107318105405626910313810224 : <"babybear"> {product_source = "compute"} + %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 = felt.const 5203908808704813498389265425172875593837960384349653691918590736979872578408 : <"babybear"> {product_source = "compute"} + %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 = felt.const 6545064306297957002139416752334741502722251869537551068239642131448768236585 : <"babybear"> {product_source = "compute"} + %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 = felt.const 3113973447392053821824427670386252797811804954746053461397972968381571297505 : <"babybear"> {product_source = "compute"} + %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 = felt.const 11501810868606870391127866188394535330696206817602260610801897042898616817272 : <"babybear"> {product_source = "compute"} + %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 = felt.const 19346204940546791021518535594447257347218878114049998691060016493806845179755 : <"babybear"> {product_source = "compute"} + %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 = felt.const 7642160509228669138628515458941659189680509753651629476399516332224325757132 : <"babybear"> {product_source = "compute"} + %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 = felt.const 17198004293191777441573635123110935015228014028618868252989374962722329283022 : <"babybear"> {product_source = "compute"} + %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 = felt.const 3180973917010545328313139835982464870638521890385603025657430208141494469656 : <"babybear"> {product_source = "compute"} + %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 = felt.const 20196970640587451358539129330170636295243141659030208529338914906436009086943 : <"babybear"> {product_source = "compute"} + %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 = felt.const 153011722355526826233082383360057587249818749719433916258246100068258954737 : <"babybear"> {product_source = "compute"} + %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 = felt.const 2832093654883670345969792724123161241696170611611744759675180839473215203706 : <"babybear"> {product_source = "compute"} + %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 = felt.const 10165780782761211520836029617746977303303335603838343292431760011576528327409 : <"babybear"> {product_source = "compute"} + %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 = felt.const 20241898894740093733047052816576694435372877719072347814065227797906130857593 : <"babybear"> {product_source = "compute"} + %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 = felt.const 10858157235265583624235850660462324469799552996870780238992046963007491306222 : <"babybear"> {product_source = "compute"} + %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 = felt.const 6745410632962119604799318394592010194450845483518862700079921360015766217097 : <"babybear"> {product_source = "compute"} + %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 = felt.const 6302388219880227251325608388535181451187131054211388356563634768253301290116 : <"babybear"> {product_source = "compute"} + %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 = felt.const 1720059427972723034107765345743336447947522473310069975142483982753181038321 : <"babybear"> {product_source = "compute"} + %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 = felt.const 10097732913112662248360143041019433907849917041759137293018029019134392559350 : <"babybear"> {product_source = "compute"} + %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 = felt.const 4144769320246558352780591737261172907511489963810975650573703217887429086546 : <"babybear"> {product_source = "compute"} + %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 = felt.const 5521922218264623411380547905210139511350706092570900075727555783240701821773 : <"babybear"> {product_source = "compute"} + %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 = felt.const 19669450123472657781282985229369348220906547335081730205028099210442632534079 : <"babybear"> {product_source = "compute"} + %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 = felt.const 15189693413320228845990326214136820307649565437237093707846682797649429515840 : <"babybear"> {product_source = "compute"} + %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 = felt.const 18875020877782404439294079398043479420415331640996249745272087358069018086569 : <"babybear"> {product_source = "compute"} + %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 = felt.const 148924106504065664829055598316821983869409581623245780505601526786791681102 : <"babybear"> {product_source = "compute"} + %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 = felt.const 1888098689545151571063267806606510032698677328923740058080630641742325067877 : <"babybear"> {product_source = "compute"} + %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 = felt.const 2436445725746972287496138382764643208791713986676129260589667864467010129482 : <"babybear"> {product_source = "compute"} + %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 = felt.const 11878652861183667748838188993669912629573713271883125458838494308957689090959 : <"babybear"> {product_source = "compute"} + %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 = felt.const 16688277490485052681847773549197928630624828392248424077804829676011512392564 : <"babybear"> {product_source = "compute"} + %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 = felt.const 4622170486584704769521001011395820886029808520586507873417553166762370293671 : <"babybear"> {product_source = "compute"} + %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 = felt.const 16845753148201777192406958674202574751725237939980634861948953189320362207797 : <"babybear"> {product_source = "compute"} + %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 = felt.const 4623894483395123520243967718315330178025957095502546813929290333264120223168 : <"babybear"> {product_source = "compute"} + %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 = felt.const 5404287610364961067658660283245291234008692303120470305032076412056764726509 : <"babybear"> {product_source = "compute"} + %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 = felt.const 10796443006899450245502071131975731672911747129805343722228413358507805531141 : <"babybear"> {product_source = "compute"} + %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 = felt.const 8080173465267536232534446836148661251987053305394647905212781979099916615292 : <"babybear"> {product_source = "compute"} + %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 = felt.const 18146517657445423462330854383025300323335289319277199154920964274562014376193 : <"babybear"> {product_source = "compute"} + %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 = felt.const 20391289379084797414557439284689954098721219201171527383291525676334308303023 : <"babybear"> {product_source = "compute"} + %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 = felt.const 7556750851783822914673316211129907782679509728346361368978891584375551186255 : <"babybear"> {product_source = "compute"} + %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 = felt.const 3683645737503705042628598550438395339383572464204988015434959428676652575331 : <"babybear"> {product_source = "compute"} + %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 = felt.const 749264854018824809464168489785113337925400687349357088413132714480582918506 : <"babybear"> {product_source = "compute"} + %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 = felt.const 16771780563523793011283273687253985566177232886900511371656074413362142152543 : <"babybear"> {product_source = "compute"} + %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 = felt.const 11897542014760736209670863723231849628230383119798486487899539017466261308762 : <"babybear"> {product_source = "compute"} + %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 = felt.const 10005334761930299057035055370088813230849810566234116771751925093634136574742 : <"babybear"> {product_source = "compute"} + %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 = felt.const 17387238494588145257484818061490088963673275521250153686214197573695921400950 : <"babybear"> {product_source = "compute"} + %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 = felt.const 4798196928559910300796064665904583125427459076060519468052008159779219347957 : <"babybear"> {product_source = "compute"} + %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 = felt.const 9864183311657946807255900203841777810810224615118629957816193727554621093838 : <"babybear"> {product_source = "compute"} + %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 = felt.const 7207551498477838452286210989212982851118089401128156132319807392460388436957 : <"babybear"> {product_source = "compute"} + %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 = felt.const 7667462281466170157858259197976388676420847047604921256361474169980037581876 : <"babybear"> {product_source = "compute"} + %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 = felt.const 18162138253399958831050545255414688239130588254891200470934232514682584734511 : <"babybear"> {product_source = "compute"} + %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 = felt.const 1213715278223786725806155661738676903520350859678319590331207960381534602599 : <"babybear"> {product_source = "compute"} + %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 = felt.const 19886576439381707240399940949310933992335779767309383709787331470398675714258 : <"babybear"> {product_source = "compute"} + %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 = felt.const 17980351014018068290387269214713820287804403312720763401943303895585469787384 : <"babybear"> {product_source = "compute"} + %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 = felt.const 5024705281721889198577876690145313457398658950011302225525409148828000436681 : <"babybear"> {product_source = "compute"} + %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 = felt.const 7120861356467848435263064379192047478074060781135320967663101236819528304084 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MiMCFeistel_0::@MiMCFeistel_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !felt.type<"babybear"> {product_source = "compute"} + %nondet_1 = llzk.nondet : !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_2 = llzk.nondet : !felt.type<"babybear"> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<218 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c3] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c4] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c5] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c6] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c7] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c8] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c9] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c10] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c11] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c12] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c13] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c14] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c15] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c16] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c17] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c18] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c19] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c20] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c21] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c22] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c23] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c24] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c25] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c26] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c27] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c28] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c29] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c30] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c31] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c32] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c33] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c34] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c35] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c36] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c37] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c38] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c39] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c40] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c41] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c42] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c43] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c44] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c45] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c46] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c47] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c48] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c49] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c50] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c51] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c52] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c53] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c54] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c55] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c56] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c57] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c58] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c59] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c60] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c61] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c62] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c64] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c65] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c66] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c67] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c68] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c69] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c70] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c71] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c72] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c73] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c74] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c75] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c76] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c77] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c78] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c79] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c80] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c81] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c82] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c83] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c84] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c85] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c86] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c87] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c88] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c89] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c90] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c91] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c92] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c93] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c94] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c95] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c96] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c97] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c98] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c99] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c100] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c101] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c102] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c103] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c104] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c105] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c106] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c107] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c108] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c109] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c110] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c111] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c112] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c113] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c114] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c115] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c116] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c117] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c118] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c119] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c120] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c121] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c122] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c123] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c124] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c125] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c126] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c127] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c128] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c129] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c130] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c131] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c132] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c133] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c134] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c135] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c136] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c137] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c138] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c139] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c140] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c141] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c142] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c143] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c144] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c145] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c146] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c147] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c148] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c149] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c150] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c151] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c152] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c153] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c154] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c155] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c156] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c157] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c158] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c159] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c160] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c161] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c162] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c163] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c164] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c165] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c166] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c167] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c168] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c169] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c170] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c171] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c172] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c173] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c174] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c175] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c176] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c177] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c178] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c179] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c180] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c181] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c182] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c183] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c184] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c185] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c186] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c187] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c188] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c189] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c190] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c191] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c192] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c193] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c194] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c195] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c196] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c197] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c198] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c199] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c200] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c201] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c202] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c203] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c204] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c205] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c206] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c207] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c208] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c209] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c210] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c211] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c212] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c213] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c214] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c215] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c216] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c217] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c3] = %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c4] = %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c5] = %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c6] = %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c7] = %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c8] = %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c9] = %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c10] = %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c11] = %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c12] = %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c13] = %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c14] = %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c15] = %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c16] = %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c17] = %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c18] = %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c19] = %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c20] = %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c21] = %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c22] = %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c23] = %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c24] = %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c25] = %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c26] = %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c27] = %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c28] = %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c29] = %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c30] = %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c31] = %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c32] = %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c33] = %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c34] = %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c35] = %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c36] = %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c37] = %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c38] = %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c39] = %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c40] = %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c41] = %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c42] = %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c43] = %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c44] = %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c45] = %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c46] = %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c47] = %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c48] = %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c49] = %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c50] = %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c51] = %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c52] = %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c53] = %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c54] = %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c55] = %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c56] = %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c57] = %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c58] = %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c59] = %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c60] = %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c61] = %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c62] = %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c64] = %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c65] = %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c66] = %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c67] = %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c68] = %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c69] = %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c70] = %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c71] = %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c72] = %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c73] = %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c74] = %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c75] = %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c76] = %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c77] = %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c78] = %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c79] = %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c80] = %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c81] = %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c82] = %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c83] = %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c84] = %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c85] = %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c86] = %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c87] = %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c88] = %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c89] = %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c90] = %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c91] = %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c92] = %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c93] = %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c94] = %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c95] = %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c96] = %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c97] = %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c98] = %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c99] = %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c100] = %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c101] = %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c102] = %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c103] = %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c104] = %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c105] = %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c106] = %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c107] = %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c108] = %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c109] = %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c110] = %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c111] = %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c112] = %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c113] = %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c114] = %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c115] = %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c116] = %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c117] = %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c118] = %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c119] = %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c120] = %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c121] = %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c122] = %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c123] = %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c124] = %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c125] = %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c126] = %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c127] = %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c128] = %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c129] = %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c130] = %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c131] = %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c132] = %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c133] = %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c134] = %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c135] = %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c136] = %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c137] = %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c138] = %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c139] = %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c140] = %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c141] = %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c142] = %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c143] = %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c144] = %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c145] = %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c146] = %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c147] = %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c148] = %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c149] = %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c150] = %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c151] = %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c152] = %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c153] = %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c154] = %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c155] = %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c156] = %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c157] = %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c158] = %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c159] = %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c160] = %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c161] = %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c162] = %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c163] = %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c164] = %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c165] = %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c166] = %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c167] = %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c168] = %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c169] = %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c170] = %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c171] = %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c172] = %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c173] = %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c174] = %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c175] = %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c176] = %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c177] = %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c178] = %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c179] = %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c180] = %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c181] = %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c182] = %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c183] = %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c184] = %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c185] = %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c186] = %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c187] = %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c188] = %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c189] = %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c190] = %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c191] = %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c192] = %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c193] = %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c194] = %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c195] = %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c196] = %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c197] = %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c198] = %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c199] = %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c200] = %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c201] = %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c202] = %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c203] = %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c204] = %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c205] = %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c206] = %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c207] = %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c208] = %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c209] = %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c210] = %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c211] = %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c212] = %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c213] = %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c214] = %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c215] = %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c216] = %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c217] = %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0:2 = scf.for %arg3 = %c0 to %c220 step %c1 iter_args(%arg4 = %nondet_2, %arg5 = %nondet_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp eq(%1, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = bool.or %2, %3 : i1, i1 {product_source = "compute"} + %5 = scf.if %4 -> (!felt.type<"babybear">) { + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } else { + %18 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %nondet_5[%19] : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %20 : !felt.type<"babybear"> + } {product_source = "compute"} + %6 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %18 = felt.add %arg2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %18 : !felt.type<"babybear"> + } else { + %18 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %nondet[%19] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %arg2, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.add %21, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %22 : !felt.type<"babybear"> + } {product_source = "compute"} + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%9] = %8 : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %nondet_3[%10] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_3[%12] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %11, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%15] = %14 : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = bool.cmp lt(%1, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17:2 = scf.if %16 -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %18 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = scf.if %18 -> (!felt.type<"babybear">) { + scf.yield {product_source = "compute"} %arg1 : !felt.type<"babybear"> + } else { + %26 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %nondet_1[%27] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %28 : !felt.type<"babybear"> + } {product_source = "compute"} + %20 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %nondet_4[%20] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %21, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %25 { + %26 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%26] = %arg0 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %26 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %nondet[%27] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%29] = %28 : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.yield {product_source = "compute"} %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %18 = array.read %nondet_1[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet_4[%c219] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %19, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@xRout] = %21 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %nondet[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@xLout] = %22 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %22, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield %17#0, %17#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@t2] = %nondet_3 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t4] = %nondet_4 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@xL] = %nondet : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@xR] = %nondet_1 : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMCFeistel_0::@MiMCFeistel_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c219 = arith.constant 219 : index + %c218 = arith.constant 218 : index + %c220 = arith.constant 220 : index + %c217 = arith.constant 217 : index + %c216 = arith.constant 216 : index + %c215 = arith.constant 215 : index + %c214 = arith.constant 214 : index + %c213 = arith.constant 213 : index + %c212 = arith.constant 212 : index + %c211 = arith.constant 211 : index + %c210 = arith.constant 210 : index + %c209 = arith.constant 209 : index + %c208 = arith.constant 208 : index + %c207 = arith.constant 207 : index + %c206 = arith.constant 206 : index + %c205 = arith.constant 205 : index + %c204 = arith.constant 204 : index + %c203 = arith.constant 203 : index + %c202 = arith.constant 202 : index + %c201 = arith.constant 201 : index + %c200 = arith.constant 200 : index + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_219 = felt.const 219 : <"babybear"> {product_source = "constrain"} + %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 = felt.const 2119542016932434047340813757208803962484943912710204325088879681995922344971 : <"babybear"> {product_source = "constrain"} + %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 = felt.const 11050822248291117548220126630860474473945266276626263036056336623671308219529 : <"babybear"> {product_source = "constrain"} + %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 = felt.const 274945154732293792784580363548970818611304339008964723447672490026510689427 : <"babybear"> {product_source = "constrain"} + %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 = felt.const 18224457394066545825553407391290108485121649197258948320896164404518684305122 : <"babybear"> {product_source = "constrain"} + %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 = felt.const 14227467863135365427954093998621993651369686288941275436795622973781503444257 : <"babybear"> {product_source = "constrain"} + %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 = felt.const 16085392195894691829567913404182676871326863890140775376809129785155092531260 : <"babybear"> {product_source = "constrain"} + %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 = felt.const 5628039096440332922248578319648483863204530861778160259559031331287721255522 : <"babybear"> {product_source = "constrain"} + %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 = felt.const 15162538063742142685306302282127534305212832649282186184583465569986719234456 : <"babybear"> {product_source = "constrain"} + %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 = felt.const 2273205422216987330510475127669563545720586464429614439716564154166712854048 : <"babybear"> {product_source = "constrain"} + %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 = felt.const 7400481189785154329569470986896455371037813715804007747228648863919991399081 : <"babybear"> {product_source = "constrain"} + %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 = felt.const 16641596134749940573104316021365063031319260205559553673368334842484345864859 : <"babybear"> {product_source = "constrain"} + %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 = felt.const 17297554111853491139852678417579991271009602631577069694853813331124433680030 : <"babybear"> {product_source = "constrain"} + %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 = felt.const 6936272626871035740815028148058841877090860312517423346335878088297448888663 : <"babybear"> {product_source = "constrain"} + %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 = felt.const 12732823292801537626009139514048596316076834307941224506504666470961250728055 : <"babybear"> {product_source = "constrain"} + %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 = felt.const 6842203153996907264167856337497139692895299874139131328642472698663046726780 : <"babybear"> {product_source = "constrain"} + %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 = felt.const 15117544653571553820496948522381772148324367479772362833334593000535648316185 : <"babybear"> {product_source = "constrain"} + %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 = felt.const 6479667912792222539919362076122453947926362746906450079329453150607427372979 : <"babybear"> {product_source = "constrain"} + %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 = felt.const 10702811721859145441471328511968332847175733707711670171718794132331147396634 : <"babybear"> {product_source = "constrain"} + %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 = felt.const 12216779172735125538689875667307129262237123728082657485828359100719208190116 : <"babybear"> {product_source = "constrain"} + %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 = felt.const 9244680976345080074252591214216060854998619670381671198295645618515047080988 : <"babybear"> {product_source = "constrain"} + %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 = felt.const 8242601581342441750402731523736202888792436665415852106196418942315563860366 : <"babybear"> {product_source = "constrain"} + %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 = felt.const 14016139747289624978792446847000951708158212463304817001882956166752906714332 : <"babybear"> {product_source = "constrain"} + %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 = felt.const 17566185590731088197064706533119299946752127014428399631467913813769853431107 : <"babybear"> {product_source = "constrain"} + %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 = felt.const 10814026414212439999107945133852431304483604215416531759535467355316227331774 : <"babybear"> {product_source = "constrain"} + %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 = felt.const 11498264615058604317482574216318586415670903094838791165247179252175768794889 : <"babybear"> {product_source = "constrain"} + %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 = felt.const 18664315914479294273286016871365663486061896605232511201418576829062292269769 : <"babybear"> {product_source = "constrain"} + %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 = felt.const 19212515502973904821995111796203064175854996071497099383090983975618035391558 : <"babybear"> {product_source = "constrain"} + %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 = felt.const 6614652990340435611114076169697104582524566019034036680161902142028967568142 : <"babybear"> {product_source = "constrain"} + %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 = felt.const 8653175945487997845203439345797943132543211416447757110963967501177317426221 : <"babybear"> {product_source = "constrain"} + %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 = felt.const 3819598418157732134449049289585680301176983019643974929528867686268702720163 : <"babybear"> {product_source = "constrain"} + %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 = felt.const 1258781501221760320019859066036073675029057285507345332959539295621677296991 : <"babybear"> {product_source = "constrain"} + %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 = felt.const 21578580340755653236050830649990190843552802306886938815497471545814130084980 : <"babybear"> {product_source = "constrain"} + %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 = felt.const 15092262360719700162343163278648422751610766427236295023221516498310468956361 : <"babybear"> {product_source = "constrain"} + %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 = felt.const 2929658084700714257515872921366736697080475676508114973627124569375444665664 : <"babybear"> {product_source = "constrain"} + %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 = felt.const 19914849528178967155534624144358541535306360577227460456855821557421213606310 : <"babybear"> {product_source = "constrain"} + %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 = felt.const 17047263688548829001253658727764731047114098556534482052135734487985276987385 : <"babybear"> {product_source = "constrain"} + %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 = felt.const 19187314764836593118404597958543112407224947638377479622725713735224279297009 : <"babybear"> {product_source = "constrain"} + %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 = felt.const 11028094245762332275225364962905938096659249161369092798505554939952525894293 : <"babybear"> {product_source = "constrain"} + %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 = felt.const 5542499997310181530432302492142574333860449305424174466698068685590909336771 : <"babybear"> {product_source = "constrain"} + %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 = felt.const 1205448543652932944633962232545707633928124666868453915721030884663332604536 : <"babybear"> {product_source = "constrain"} + %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 = felt.const 5300440870136391278944213332144327695659161151625757537632832724102670898756 : <"babybear"> {product_source = "constrain"} + %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 = felt.const 8777887112076272395250620301071581171386440850451972412060638225741125310886 : <"babybear"> {product_source = "constrain"} + %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 = felt.const 5100105771517691442278432864090229416166996183792075307747582375962855820797 : <"babybear"> {product_source = "constrain"} + %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 = felt.const 20871081766843466343749609089986071784031203517506781251203251608363835140622 : <"babybear"> {product_source = "constrain"} + %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 = felt.const 19871836214837460419845806980869387567383718044439891735114283113359312279540 : <"babybear"> {product_source = "constrain"} + %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 = felt.const 10796631184889302076168355684722130903785890709107732067446714470783437829037 : <"babybear"> {product_source = "constrain"} + %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 = felt.const 6506225705710197163670556961299945987488979904603689017479840649664564978574 : <"babybear"> {product_source = "constrain"} + %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 = felt.const 15016165746156232864069722572047169071786333815661109750860165034341572904221 : <"babybear"> {product_source = "constrain"} + %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 = felt.const 15550788416669474113213749561488122552422887538676036667630838378023479382689 : <"babybear"> {product_source = "constrain"} + %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 = felt.const 9783723818270121678386992630754842961728702994964214799008457449989291229500 : <"babybear"> {product_source = "constrain"} + %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 = felt.const 19012287860122586147374214541764572282814469237161122489573881644994964647218 : <"babybear"> {product_source = "constrain"} + %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 = felt.const 9558393272910366944245875920138649617479779893610128634419086981339060613250 : <"babybear"> {product_source = "constrain"} + %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 = felt.const 8673089750662709235894359384294076697329948991010184356091130382437645649279 : <"babybear"> {product_source = "constrain"} + %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 = felt.const 10493603554686607050979497281838644324893776154179810893893660722522945589063 : <"babybear"> {product_source = "constrain"} + %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 = felt.const 9277135875276787021836189566799935097400042171346561246305113339462708861695 : <"babybear"> {product_source = "constrain"} + %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 = felt.const 6252650284989960032925831409804233477770646333900692286731621844532438095656 : <"babybear"> {product_source = "constrain"} + %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 = felt.const 16101132301514338989512946061786320637179843435886825102406248183507106312877 : <"babybear"> {product_source = "constrain"} + %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 = felt.const 2494806857395134874309386694756263421445039103814920780777601708371037591569 : <"babybear"> {product_source = "constrain"} + %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 = felt.const 12368712287081330853637674140264759478736012797026621876924395982504369598764 : <"babybear"> {product_source = "constrain"} + %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 = felt.const 814913922521637742587885320797606426167962526342166512693085292151314976633 : <"babybear"> {product_source = "constrain"} + %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 = felt.const 438123800976401478772659663183448617575635636575786782566035096946820525816 : <"babybear"> {product_source = "constrain"} + %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 = felt.const 7733050956302327984762132317027414325566202380840692458138724610131603812560 : <"babybear"> {product_source = "constrain"} + %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 = felt.const 15895485136902450169492923978042129726601461603404514670348703312850236146328 : <"babybear"> {product_source = "constrain"} + %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 = felt.const 21280039024501430842616328642522421302481259067470872421086939673482530783142 : <"babybear"> {product_source = "constrain"} + %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 = felt.const 3667030990325966886479548860429670833692690972701471494757671819017808678584 : <"babybear"> {product_source = "constrain"} + %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 = felt.const 16690275395485630428127725067513114066329712673106153451801968992299636791385 : <"babybear"> {product_source = "constrain"} + %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 = felt.const 14222898219492484180162096141564251903058269177856173968147960855133048449557 : <"babybear"> {product_source = "constrain"} + %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 = felt.const 15566927854306879444693061574322104423426072650522411176731130806720753591030 : <"babybear"> {product_source = "constrain"} + %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 = felt.const 11272653598912269895509621181205395118899451234151664604248382803490621227687 : <"babybear"> {product_source = "constrain"} + %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 = felt.const 397690828254561723549349897112473766901585444153303054845160673059519614409 : <"babybear"> {product_source = "constrain"} + %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 = felt.const 16143265650645676880461646123844627780378251900510645261875867423498913438066 : <"babybear"> {product_source = "constrain"} + %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 = felt.const 4947482739415078212217504789923078546034438919537985740403824517728200332286 : <"babybear"> {product_source = "constrain"} + %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 = felt.const 5894928453677122829055071981254202951712129328678534592916926069506935491729 : <"babybear"> {product_source = "constrain"} + %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 = felt.const 16062117410185840274616925297332331018523844434907012275592638570193234893570 : <"babybear"> {product_source = "constrain"} + %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 = felt.const 2204224910006646535594933495262085193210692406133533679934843341237521233504 : <"babybear"> {product_source = "constrain"} + %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 = felt.const 2492729278659146790410698334997955258248120870028541691998279257260289595548 : <"babybear"> {product_source = "constrain"} + %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 = felt.const 146494141603558321291767829522948454429758543710648402457451799015963102253 : <"babybear"> {product_source = "constrain"} + %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 = felt.const 16901065971871379877929280081392692752968612240624985552337779093292740763381 : <"babybear"> {product_source = "constrain"} + %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 = felt.const 18230936781133176044598070768084230333433368654744509969087239465125979720995 : <"babybear"> {product_source = "constrain"} + %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 = felt.const 10780807212297131186617505517708903709488273075252405602261683478333331220733 : <"babybear"> {product_source = "constrain"} + %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 = felt.const 19171031072692942278056619599721228021635671304612437350119663236604712493093 : <"babybear"> {product_source = "constrain"} + %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 = felt.const 2825393571154632139467378429077438870179957021959813965940638905853993971879 : <"babybear"> {product_source = "constrain"} + %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 = felt.const 4221265384902749246920810956363310125115516771964522748896154428740238579824 : <"babybear"> {product_source = "constrain"} + %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 = felt.const 1888195070251580606973417065636430294417895423429240431595054184472931224452 : <"babybear"> {product_source = "constrain"} + %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 = felt.const 1022951765127126818581466247360193856197472064872288389992480993218645055345 : <"babybear"> {product_source = "constrain"} + %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 = felt.const 8677548159358013363291014307402600830078662555833653517843708051504582990832 : <"babybear"> {product_source = "constrain"} + %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 = felt.const 4467191506765339364971058668792642195242197133011672559453028147641428433293 : <"babybear"> {product_source = "constrain"} + %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 = felt.const 16729368143229828574342820060716366330476985824952922184463387490091156065099 : <"babybear"> {product_source = "constrain"} + %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 = felt.const 21297149835078365363970699581821844234354988617890041296044775371855432973500 : <"babybear"> {product_source = "constrain"} + %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 = felt.const 10090204501612803176317709245679152331057882187411777688746797044706063410969 : <"babybear"> {product_source = "constrain"} + %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 = felt.const 248732676202643792226973868626360612151424823368345645514532870586234380100 : <"babybear"> {product_source = "constrain"} + %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 = felt.const 3506345610354615013737144848471391553141006285964325596214723571988011984829 : <"babybear"> {product_source = "constrain"} + %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 = felt.const 18364168158495573675698600238443218434246806358811328083953887470513967121206 : <"babybear"> {product_source = "constrain"} + %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 = felt.const 4993662582188632374202316265508850988596880036291765531885657575099537176757 : <"babybear"> {product_source = "constrain"} + %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 = felt.const 6678298831065390834922566306988418588227382406175769592902974103663687992230 : <"babybear"> {product_source = "constrain"} + %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 = felt.const 10761027113757988230637066281488532903174559953630210849190212601991063767647 : <"babybear"> {product_source = "constrain"} + %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 = felt.const 21171984405852590343970239018692870799717057961108910523876770029017785940991 : <"babybear"> {product_source = "constrain"} + %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 = felt.const 21345603324471810861925019445720576814602636473739003852898308205213912255830 : <"babybear"> {product_source = "constrain"} + %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 = felt.const 8465768840047024550750516678171433288207841931251654898809033371655109266663 : <"babybear"> {product_source = "constrain"} + %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 = felt.const 16395063164993626722686882727042150241125309409717445381854913964674649318585 : <"babybear"> {product_source = "constrain"} + %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 = felt.const 13973538843621261113924259058427434053808430378163734641175100160836376897004 : <"babybear"> {product_source = "constrain"} + %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 = felt.const 14595204575654316237672764823862241845410365278802914304953002937313300553572 : <"babybear"> {product_source = "constrain"} + %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 = felt.const 5027602491523497423798779154966735896562099398367163998686335127580757861872 : <"babybear"> {product_source = "constrain"} + %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 = felt.const 792781492853909872425531014397300057232399608769451037135936617996830018501 : <"babybear"> {product_source = "constrain"} + %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 = felt.const 20977948360215259915441258687649465618185769343138135384346964466965010873779 : <"babybear"> {product_source = "constrain"} + %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 = felt.const 11311085442652291634822798307831431035776248927202286895207125867542470350078 : <"babybear"> {product_source = "constrain"} + %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 = felt.const 6574066859860991369704567902211886840188702386542112593710271426704432301235 : <"babybear"> {product_source = "constrain"} + %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 = felt.const 11246573086260753259993971254725613211193686683988426513880826148090811891866 : <"babybear"> {product_source = "constrain"} + %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 = felt.const 10142447197759703415402259672441315777933858467700579946665223821199077641122 : <"babybear"> {product_source = "constrain"} + %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 = felt.const 15487549757142039139328911515400805508248576685795694919457041092150651939253 : <"babybear"> {product_source = "constrain"} + %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 = felt.const 18192064100315141084242006659317257023098826945893371479835220462302399655674 : <"babybear"> {product_source = "constrain"} + %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 = felt.const 214219368547551689972421167733597094823289857206402800635962137077096090722 : <"babybear"> {product_source = "constrain"} + %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 = felt.const 2391801327305361293476178683853802679507598622000359948432171562543560193350 : <"babybear"> {product_source = "constrain"} + %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 = felt.const 4365864398105436789177703571412645548020537580493599380018290523813331678900 : <"babybear"> {product_source = "constrain"} + %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 = felt.const 3981753758468103976812813304477670033098707002886030847251581853700311567551 : <"babybear"> {product_source = "constrain"} + %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 = felt.const 10041051776251223165849354194892664881051125330236567356945669006147134614302 : <"babybear"> {product_source = "constrain"} + %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 = felt.const 1571520786233540988201616650622796363168031165456869481368085474420849243232 : <"babybear"> {product_source = "constrain"} + %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 = felt.const 17467794879902895769410571945152708684493991588672014763135370927880883292655 : <"babybear"> {product_source = "constrain"} + %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 = felt.const 2821730726367472966906149684046356272806484545281639696873240305052362149654 : <"babybear"> {product_source = "constrain"} + %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 = felt.const 11061717085931490100602849654034280576915102867237101935487893025907907250695 : <"babybear"> {product_source = "constrain"} + %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 = felt.const 16709604795697901641948603019242067672006293290826991671766611326262532802914 : <"babybear"> {product_source = "constrain"} + %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 = felt.const 3804047064713122820157099453648459188816376755739202017447862327783289895072 : <"babybear"> {product_source = "constrain"} + %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 = felt.const 18787428285295558781869865751953016580493190547148386433580291216673009884554 : <"babybear"> {product_source = "constrain"} + %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 = felt.const 14740327483193277147065845135561988641238516852487657117813536909482068950652 : <"babybear"> {product_source = "constrain"} + %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 = felt.const 14731806221235869882801331463708736361296174006732553130708107037190460654379 : <"babybear"> {product_source = "constrain"} + %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 = felt.const 2026733759645519472558796412979210009170379159866522399881566309631434814953 : <"babybear"> {product_source = "constrain"} + %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 = felt.const 10484856914279112612610993418405543310546746652738541161791501150994088679557 : <"babybear"> {product_source = "constrain"} + %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 = felt.const 32883284540320451295484135704808083452381176816565850047310272290579727564 : <"babybear"> {product_source = "constrain"} + %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 = felt.const 2511432546938591792036639990606464315121646668029252285288323664350666551637 : <"babybear"> {product_source = "constrain"} + %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 = felt.const 5007518659266430200134478928344522649876467369278722765097865662497773767152 : <"babybear"> {product_source = "constrain"} + %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 = felt.const 1153669123397255702524721206511185557982017410156956216465120456256288427021 : <"babybear"> {product_source = "constrain"} + %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 = felt.const 10810123816265612772922113403831964815724109728287572256602010709288980656498 : <"babybear"> {product_source = "constrain"} + %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 = felt.const 1813584943682214789802230765734821149202472893379265320098816901270224589984 : <"babybear"> {product_source = "constrain"} + %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 = felt.const 4923772847693564777744725640710197015181591950368494148029046443433103381621 : <"babybear"> {product_source = "constrain"} + %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 = felt.const 21815578223768330433802113452339488275704145896544481092014911825656390567514 : <"babybear"> {product_source = "constrain"} + %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 = felt.const 2016095394399807253596787752134573207202567875457560571095586743878953450738 : <"babybear"> {product_source = "constrain"} + %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 = felt.const 10868453624107875516866146499877130701929063632959660262366632833504750028858 : <"babybear"> {product_source = "constrain"} + %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 = felt.const 12200212977482648306758992405065921724409841940671166017620928947866825250857 : <"babybear"> {product_source = "constrain"} + %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 = felt.const 176061952957067086877570020242717222844908281373122372938833890096257042779 : <"babybear"> {product_source = "constrain"} + %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 = felt.const 8756385288462344550200229174435953103162307705310807828651304665320046782583 : <"babybear"> {product_source = "constrain"} + %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 = felt.const 9607550223176946388146938069307456967842408600269548190739947540821716354749 : <"babybear"> {product_source = "constrain"} + %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 = felt.const 11332046574800279729678603488745295198038913503395629790213378101166488244657 : <"babybear"> {product_source = "constrain"} + %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 = felt.const 12771414330193951156383998390424063470766226667986423961689712557338777174205 : <"babybear"> {product_source = "constrain"} + %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 = felt.const 18824274411769830274877839365728651108434404855803844568234862945613766611460 : <"babybear"> {product_source = "constrain"} + %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 = felt.const 19001050671757720352890779127693793630251266879994702723636759889378387053056 : <"babybear"> {product_source = "constrain"} + %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 = felt.const 148317947440800089795933930720822493695520852448386394775371401743494965187 : <"babybear"> {product_source = "constrain"} + %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 = felt.const 7132325028834551397904855671244375895110341505383911719294705267624034122405 : <"babybear"> {product_source = "constrain"} + %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 = felt.const 18725396114211370207078434315900726338547621160475533496863298091023511945076 : <"babybear"> {product_source = "constrain"} + %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 = felt.const 16533189939837087893364000390641148516479148564190420358849587959161226782982 : <"babybear"> {product_source = "constrain"} + %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 = felt.const 17784386835392322654196171115293700800825771210400152504776806618892170162248 : <"babybear"> {product_source = "constrain"} + %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 = felt.const 10394369641533736715250242399198097296122982486516256408681925424076248952280 : <"babybear"> {product_source = "constrain"} + %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 = felt.const 17213012626801210615058753489149961717422101711567228037597150941152495100640 : <"babybear"> {product_source = "constrain"} + %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 = felt.const 8327443473179334761744301768309008451162322941906921742120510244986704677004 : <"babybear"> {product_source = "constrain"} + %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 = felt.const 168282396747788514908709091757591226095443902501365500003618183905496160435 : <"babybear"> {product_source = "constrain"} + %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 = felt.const 16390754464333401712265575949874369157699293840516802426621216808905079127650 : <"babybear"> {product_source = "constrain"} + %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 = felt.const 8959562060028569701043973060670353733575345393653685776974948916988033453971 : <"babybear"> {product_source = "constrain"} + %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 = felt.const 15618589556584434434009868216186115416835494805174158488636000580759692174228 : <"babybear"> {product_source = "constrain"} + %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 = felt.const 916941639326869583414469202910306428966657806899788970948781207501251816730 : <"babybear"> {product_source = "constrain"} + %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 = felt.const 13162342403579303950549728848130828093497701266240457479693991108217307949435 : <"babybear"> {product_source = "constrain"} + %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 = felt.const 5363660674689121676875069134269386492382220935599781121306637800261912519729 : <"babybear"> {product_source = "constrain"} + %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 = felt.const 12855514863299373699594410385788943772765811961581749194183533625311486462501 : <"babybear"> {product_source = "constrain"} + %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 = felt.const 8837549193990558762776520822018694066937602576881497343584903902880277769302 : <"babybear"> {product_source = "constrain"} + %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 = felt.const 5543749482491340532547407723464609328207990784853381797689466144924198391839 : <"babybear"> {product_source = "constrain"} + %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 = felt.const 11760570435432189127645691249600821064883781677693087773459065574359292849137 : <"babybear"> {product_source = "constrain"} + %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 = felt.const 2246692432011290582160062129070762007374502637007107318105405626910313810224 : <"babybear"> {product_source = "constrain"} + %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 = felt.const 5203908808704813498389265425172875593837960384349653691918590736979872578408 : <"babybear"> {product_source = "constrain"} + %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 = felt.const 6545064306297957002139416752334741502722251869537551068239642131448768236585 : <"babybear"> {product_source = "constrain"} + %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 = felt.const 3113973447392053821824427670386252797811804954746053461397972968381571297505 : <"babybear"> {product_source = "constrain"} + %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 = felt.const 11501810868606870391127866188394535330696206817602260610801897042898616817272 : <"babybear"> {product_source = "constrain"} + %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 = felt.const 19346204940546791021518535594447257347218878114049998691060016493806845179755 : <"babybear"> {product_source = "constrain"} + %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 = felt.const 7642160509228669138628515458941659189680509753651629476399516332224325757132 : <"babybear"> {product_source = "constrain"} + %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 = felt.const 17198004293191777441573635123110935015228014028618868252989374962722329283022 : <"babybear"> {product_source = "constrain"} + %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 = felt.const 3180973917010545328313139835982464870638521890385603025657430208141494469656 : <"babybear"> {product_source = "constrain"} + %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 = felt.const 20196970640587451358539129330170636295243141659030208529338914906436009086943 : <"babybear"> {product_source = "constrain"} + %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 = felt.const 153011722355526826233082383360057587249818749719433916258246100068258954737 : <"babybear"> {product_source = "constrain"} + %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 = felt.const 2832093654883670345969792724123161241696170611611744759675180839473215203706 : <"babybear"> {product_source = "constrain"} + %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 = felt.const 10165780782761211520836029617746977303303335603838343292431760011576528327409 : <"babybear"> {product_source = "constrain"} + %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 = felt.const 20241898894740093733047052816576694435372877719072347814065227797906130857593 : <"babybear"> {product_source = "constrain"} + %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 = felt.const 10858157235265583624235850660462324469799552996870780238992046963007491306222 : <"babybear"> {product_source = "constrain"} + %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 = felt.const 6745410632962119604799318394592010194450845483518862700079921360015766217097 : <"babybear"> {product_source = "constrain"} + %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 = felt.const 6302388219880227251325608388535181451187131054211388356563634768253301290116 : <"babybear"> {product_source = "constrain"} + %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 = felt.const 1720059427972723034107765345743336447947522473310069975142483982753181038321 : <"babybear"> {product_source = "constrain"} + %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 = felt.const 10097732913112662248360143041019433907849917041759137293018029019134392559350 : <"babybear"> {product_source = "constrain"} + %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 = felt.const 4144769320246558352780591737261172907511489963810975650573703217887429086546 : <"babybear"> {product_source = "constrain"} + %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 = felt.const 5521922218264623411380547905210139511350706092570900075727555783240701821773 : <"babybear"> {product_source = "constrain"} + %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 = felt.const 19669450123472657781282985229369348220906547335081730205028099210442632534079 : <"babybear"> {product_source = "constrain"} + %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 = felt.const 15189693413320228845990326214136820307649565437237093707846682797649429515840 : <"babybear"> {product_source = "constrain"} + %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 = felt.const 18875020877782404439294079398043479420415331640996249745272087358069018086569 : <"babybear"> {product_source = "constrain"} + %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 = felt.const 148924106504065664829055598316821983869409581623245780505601526786791681102 : <"babybear"> {product_source = "constrain"} + %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 = felt.const 1888098689545151571063267806606510032698677328923740058080630641742325067877 : <"babybear"> {product_source = "constrain"} + %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 = felt.const 2436445725746972287496138382764643208791713986676129260589667864467010129482 : <"babybear"> {product_source = "constrain"} + %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 = felt.const 11878652861183667748838188993669912629573713271883125458838494308957689090959 : <"babybear"> {product_source = "constrain"} + %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 = felt.const 16688277490485052681847773549197928630624828392248424077804829676011512392564 : <"babybear"> {product_source = "constrain"} + %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 = felt.const 4622170486584704769521001011395820886029808520586507873417553166762370293671 : <"babybear"> {product_source = "constrain"} + %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 = felt.const 16845753148201777192406958674202574751725237939980634861948953189320362207797 : <"babybear"> {product_source = "constrain"} + %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 = felt.const 4623894483395123520243967718315330178025957095502546813929290333264120223168 : <"babybear"> {product_source = "constrain"} + %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 = felt.const 5404287610364961067658660283245291234008692303120470305032076412056764726509 : <"babybear"> {product_source = "constrain"} + %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 = felt.const 10796443006899450245502071131975731672911747129805343722228413358507805531141 : <"babybear"> {product_source = "constrain"} + %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 = felt.const 8080173465267536232534446836148661251987053305394647905212781979099916615292 : <"babybear"> {product_source = "constrain"} + %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 = felt.const 18146517657445423462330854383025300323335289319277199154920964274562014376193 : <"babybear"> {product_source = "constrain"} + %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 = felt.const 20391289379084797414557439284689954098721219201171527383291525676334308303023 : <"babybear"> {product_source = "constrain"} + %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 = felt.const 7556750851783822914673316211129907782679509728346361368978891584375551186255 : <"babybear"> {product_source = "constrain"} + %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 = felt.const 3683645737503705042628598550438395339383572464204988015434959428676652575331 : <"babybear"> {product_source = "constrain"} + %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 = felt.const 749264854018824809464168489785113337925400687349357088413132714480582918506 : <"babybear"> {product_source = "constrain"} + %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 = felt.const 16771780563523793011283273687253985566177232886900511371656074413362142152543 : <"babybear"> {product_source = "constrain"} + %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 = felt.const 11897542014760736209670863723231849628230383119798486487899539017466261308762 : <"babybear"> {product_source = "constrain"} + %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 = felt.const 10005334761930299057035055370088813230849810566234116771751925093634136574742 : <"babybear"> {product_source = "constrain"} + %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 = felt.const 17387238494588145257484818061490088963673275521250153686214197573695921400950 : <"babybear"> {product_source = "constrain"} + %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 = felt.const 4798196928559910300796064665904583125427459076060519468052008159779219347957 : <"babybear"> {product_source = "constrain"} + %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 = felt.const 9864183311657946807255900203841777810810224615118629957816193727554621093838 : <"babybear"> {product_source = "constrain"} + %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 = felt.const 7207551498477838452286210989212982851118089401128156132319807392460388436957 : <"babybear"> {product_source = "constrain"} + %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 = felt.const 7667462281466170157858259197976388676420847047604921256361474169980037581876 : <"babybear"> {product_source = "constrain"} + %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 = felt.const 18162138253399958831050545255414688239130588254891200470934232514682584734511 : <"babybear"> {product_source = "constrain"} + %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 = felt.const 1213715278223786725806155661738676903520350859678319590331207960381534602599 : <"babybear"> {product_source = "constrain"} + %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 = felt.const 19886576439381707240399940949310933992335779767309383709787331470398675714258 : <"babybear"> {product_source = "constrain"} + %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 = felt.const 17980351014018068290387269214713820287804403312720763401943303895585469787384 : <"babybear"> {product_source = "constrain"} + %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 = felt.const 5024705281721889198577876690145313457398658950011302225525409148828000436681 : <"babybear"> {product_source = "constrain"} + %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 = felt.const 7120861356467848435263064379192047478074060781135320967663101236819528304084 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@xLout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@xRout] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %arg0[@t2] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@t4] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<220 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %arg0[@xL] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %arg0[@xR] : <@MiMCFeistel_0::@MiMCFeistel_0<[]>>, !array.type<219 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<218 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c64] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c65] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c66] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c67] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c68] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c69] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c70] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c71] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c72] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c73] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c74] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c75] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c76] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c77] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c78] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c79] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c80] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c81] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c82] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c83] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c84] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c85] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c86] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c87] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c88] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c89] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c90] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c91] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c92] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c93] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c94] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c95] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c96] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c97] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c98] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c99] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c100] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c101] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c102] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c103] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c104] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c105] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c106] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c107] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c108] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c109] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c110] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c111] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c112] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c113] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c114] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c115] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c116] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c117] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c118] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c119] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c120] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c121] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c122] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c123] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c124] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c125] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c126] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c127] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c128] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c129] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c130] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c131] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c132] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c133] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c134] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c135] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c136] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c137] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c138] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c139] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c140] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c141] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c142] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c143] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c144] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c145] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c146] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c147] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c148] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c149] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c150] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c151] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c152] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c153] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c154] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c155] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c156] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c157] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c158] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c159] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c160] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c161] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c162] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c163] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c164] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c165] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c166] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c167] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c168] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c169] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c170] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c171] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c172] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c173] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c174] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c175] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c176] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c177] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c178] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c179] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c180] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c181] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c182] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c183] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c184] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c185] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c186] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c187] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c188] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c189] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c190] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c191] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c192] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c193] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c194] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c195] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c196] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c197] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c198] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c199] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c200] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c201] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c202] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c203] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c204] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c205] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c206] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c207] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c208] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c209] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c210] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c211] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c212] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c213] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c214] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c215] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c216] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c217] = %felt_const_0 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_7120861356467848435263064379192047478074060781135320967663101236819528304084 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_5024705281721889198577876690145313457398658950011302225525409148828000436681 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_17980351014018068290387269214713820287804403312720763401943303895585469787384 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_19886576439381707240399940949310933992335779767309383709787331470398675714258 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_1213715278223786725806155661738676903520350859678319590331207960381534602599 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_18162138253399958831050545255414688239130588254891200470934232514682584734511 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_7667462281466170157858259197976388676420847047604921256361474169980037581876 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_7207551498477838452286210989212982851118089401128156132319807392460388436957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_9864183311657946807255900203841777810810224615118629957816193727554621093838 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_4798196928559910300796064665904583125427459076060519468052008159779219347957 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_17387238494588145257484818061490088963673275521250153686214197573695921400950 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_10005334761930299057035055370088813230849810566234116771751925093634136574742 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_11897542014760736209670863723231849628230383119798486487899539017466261308762 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_16771780563523793011283273687253985566177232886900511371656074413362142152543 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_749264854018824809464168489785113337925400687349357088413132714480582918506 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_3683645737503705042628598550438395339383572464204988015434959428676652575331 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_7556750851783822914673316211129907782679509728346361368978891584375551186255 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_20391289379084797414557439284689954098721219201171527383291525676334308303023 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_18146517657445423462330854383025300323335289319277199154920964274562014376193 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_8080173465267536232534446836148661251987053305394647905212781979099916615292 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_10796443006899450245502071131975731672911747129805343722228413358507805531141 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_5404287610364961067658660283245291234008692303120470305032076412056764726509 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_4623894483395123520243967718315330178025957095502546813929290333264120223168 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_16845753148201777192406958674202574751725237939980634861948953189320362207797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_4622170486584704769521001011395820886029808520586507873417553166762370293671 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_16688277490485052681847773549197928630624828392248424077804829676011512392564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_11878652861183667748838188993669912629573713271883125458838494308957689090959 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_2436445725746972287496138382764643208791713986676129260589667864467010129482 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_1888098689545151571063267806606510032698677328923740058080630641742325067877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_148924106504065664829055598316821983869409581623245780505601526786791681102 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_18875020877782404439294079398043479420415331640996249745272087358069018086569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_15189693413320228845990326214136820307649565437237093707846682797649429515840 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_19669450123472657781282985229369348220906547335081730205028099210442632534079 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_5521922218264623411380547905210139511350706092570900075727555783240701821773 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_4144769320246558352780591737261172907511489963810975650573703217887429086546 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_10097732913112662248360143041019433907849917041759137293018029019134392559350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_1720059427972723034107765345743336447947522473310069975142483982753181038321 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_6302388219880227251325608388535181451187131054211388356563634768253301290116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_6745410632962119604799318394592010194450845483518862700079921360015766217097 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_10858157235265583624235850660462324469799552996870780238992046963007491306222 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_20241898894740093733047052816576694435372877719072347814065227797906130857593 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_10165780782761211520836029617746977303303335603838343292431760011576528327409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_2832093654883670345969792724123161241696170611611744759675180839473215203706 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_153011722355526826233082383360057587249818749719433916258246100068258954737 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_20196970640587451358539129330170636295243141659030208529338914906436009086943 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_3180973917010545328313139835982464870638521890385603025657430208141494469656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_17198004293191777441573635123110935015228014028618868252989374962722329283022 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_7642160509228669138628515458941659189680509753651629476399516332224325757132 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_19346204940546791021518535594447257347218878114049998691060016493806845179755 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_11501810868606870391127866188394535330696206817602260610801897042898616817272 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_3113973447392053821824427670386252797811804954746053461397972968381571297505 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_6545064306297957002139416752334741502722251869537551068239642131448768236585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_5203908808704813498389265425172875593837960384349653691918590736979872578408 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_2246692432011290582160062129070762007374502637007107318105405626910313810224 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_11760570435432189127645691249600821064883781677693087773459065574359292849137 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_5543749482491340532547407723464609328207990784853381797689466144924198391839 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_8837549193990558762776520822018694066937602576881497343584903902880277769302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_12855514863299373699594410385788943772765811961581749194183533625311486462501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_5363660674689121676875069134269386492382220935599781121306637800261912519729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_13162342403579303950549728848130828093497701266240457479693991108217307949435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_916941639326869583414469202910306428966657806899788970948781207501251816730 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_15618589556584434434009868216186115416835494805174158488636000580759692174228 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_8959562060028569701043973060670353733575345393653685776974948916988033453971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_16390754464333401712265575949874369157699293840516802426621216808905079127650 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c64] = %felt_const_168282396747788514908709091757591226095443902501365500003618183905496160435 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c65] = %felt_const_8327443473179334761744301768309008451162322941906921742120510244986704677004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c66] = %felt_const_17213012626801210615058753489149961717422101711567228037597150941152495100640 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c67] = %felt_const_10394369641533736715250242399198097296122982486516256408681925424076248952280 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c68] = %felt_const_17784386835392322654196171115293700800825771210400152504776806618892170162248 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c69] = %felt_const_16533189939837087893364000390641148516479148564190420358849587959161226782982 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c70] = %felt_const_18725396114211370207078434315900726338547621160475533496863298091023511945076 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c71] = %felt_const_7132325028834551397904855671244375895110341505383911719294705267624034122405 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c72] = %felt_const_148317947440800089795933930720822493695520852448386394775371401743494965187 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c73] = %felt_const_19001050671757720352890779127693793630251266879994702723636759889378387053056 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c74] = %felt_const_18824274411769830274877839365728651108434404855803844568234862945613766611460 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c75] = %felt_const_12771414330193951156383998390424063470766226667986423961689712557338777174205 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c76] = %felt_const_11332046574800279729678603488745295198038913503395629790213378101166488244657 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c77] = %felt_const_9607550223176946388146938069307456967842408600269548190739947540821716354749 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c78] = %felt_const_8756385288462344550200229174435953103162307705310807828651304665320046782583 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c79] = %felt_const_176061952957067086877570020242717222844908281373122372938833890096257042779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c80] = %felt_const_12200212977482648306758992405065921724409841940671166017620928947866825250857 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c81] = %felt_const_10868453624107875516866146499877130701929063632959660262366632833504750028858 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c82] = %felt_const_2016095394399807253596787752134573207202567875457560571095586743878953450738 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c83] = %felt_const_21815578223768330433802113452339488275704145896544481092014911825656390567514 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c84] = %felt_const_4923772847693564777744725640710197015181591950368494148029046443433103381621 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c85] = %felt_const_1813584943682214789802230765734821149202472893379265320098816901270224589984 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c86] = %felt_const_10810123816265612772922113403831964815724109728287572256602010709288980656498 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c87] = %felt_const_1153669123397255702524721206511185557982017410156956216465120456256288427021 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c88] = %felt_const_5007518659266430200134478928344522649876467369278722765097865662497773767152 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c89] = %felt_const_2511432546938591792036639990606464315121646668029252285288323664350666551637 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c90] = %felt_const_32883284540320451295484135704808083452381176816565850047310272290579727564 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c91] = %felt_const_10484856914279112612610993418405543310546746652738541161791501150994088679557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c92] = %felt_const_2026733759645519472558796412979210009170379159866522399881566309631434814953 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c93] = %felt_const_14731806221235869882801331463708736361296174006732553130708107037190460654379 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c94] = %felt_const_14740327483193277147065845135561988641238516852487657117813536909482068950652 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c95] = %felt_const_18787428285295558781869865751953016580493190547148386433580291216673009884554 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c96] = %felt_const_3804047064713122820157099453648459188816376755739202017447862327783289895072 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c97] = %felt_const_16709604795697901641948603019242067672006293290826991671766611326262532802914 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c98] = %felt_const_11061717085931490100602849654034280576915102867237101935487893025907907250695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c99] = %felt_const_2821730726367472966906149684046356272806484545281639696873240305052362149654 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c100] = %felt_const_17467794879902895769410571945152708684493991588672014763135370927880883292655 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c101] = %felt_const_1571520786233540988201616650622796363168031165456869481368085474420849243232 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c102] = %felt_const_10041051776251223165849354194892664881051125330236567356945669006147134614302 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c103] = %felt_const_3981753758468103976812813304477670033098707002886030847251581853700311567551 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c104] = %felt_const_4365864398105436789177703571412645548020537580493599380018290523813331678900 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c105] = %felt_const_2391801327305361293476178683853802679507598622000359948432171562543560193350 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c106] = %felt_const_214219368547551689972421167733597094823289857206402800635962137077096090722 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c107] = %felt_const_18192064100315141084242006659317257023098826945893371479835220462302399655674 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c108] = %felt_const_15487549757142039139328911515400805508248576685795694919457041092150651939253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c109] = %felt_const_10142447197759703415402259672441315777933858467700579946665223821199077641122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c110] = %felt_const_11246573086260753259993971254725613211193686683988426513880826148090811891866 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c111] = %felt_const_6574066859860991369704567902211886840188702386542112593710271426704432301235 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c112] = %felt_const_11311085442652291634822798307831431035776248927202286895207125867542470350078 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c113] = %felt_const_20977948360215259915441258687649465618185769343138135384346964466965010873779 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c114] = %felt_const_792781492853909872425531014397300057232399608769451037135936617996830018501 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c115] = %felt_const_5027602491523497423798779154966735896562099398367163998686335127580757861872 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c116] = %felt_const_14595204575654316237672764823862241845410365278802914304953002937313300553572 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c117] = %felt_const_13973538843621261113924259058427434053808430378163734641175100160836376897004 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c118] = %felt_const_16395063164993626722686882727042150241125309409717445381854913964674649318585 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c119] = %felt_const_8465768840047024550750516678171433288207841931251654898809033371655109266663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c120] = %felt_const_21345603324471810861925019445720576814602636473739003852898308205213912255830 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c121] = %felt_const_21171984405852590343970239018692870799717057961108910523876770029017785940991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c122] = %felt_const_10761027113757988230637066281488532903174559953630210849190212601991063767647 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c123] = %felt_const_6678298831065390834922566306988418588227382406175769592902974103663687992230 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c124] = %felt_const_4993662582188632374202316265508850988596880036291765531885657575099537176757 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c125] = %felt_const_18364168158495573675698600238443218434246806358811328083953887470513967121206 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c126] = %felt_const_3506345610354615013737144848471391553141006285964325596214723571988011984829 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c127] = %felt_const_248732676202643792226973868626360612151424823368345645514532870586234380100 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c128] = %felt_const_10090204501612803176317709245679152331057882187411777688746797044706063410969 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c129] = %felt_const_21297149835078365363970699581821844234354988617890041296044775371855432973500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c130] = %felt_const_16729368143229828574342820060716366330476985824952922184463387490091156065099 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c131] = %felt_const_4467191506765339364971058668792642195242197133011672559453028147641428433293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c132] = %felt_const_8677548159358013363291014307402600830078662555833653517843708051504582990832 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c133] = %felt_const_1022951765127126818581466247360193856197472064872288389992480993218645055345 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c134] = %felt_const_1888195070251580606973417065636430294417895423429240431595054184472931224452 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c135] = %felt_const_4221265384902749246920810956363310125115516771964522748896154428740238579824 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c136] = %felt_const_2825393571154632139467378429077438870179957021959813965940638905853993971879 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c137] = %felt_const_19171031072692942278056619599721228021635671304612437350119663236604712493093 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c138] = %felt_const_10780807212297131186617505517708903709488273075252405602261683478333331220733 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c139] = %felt_const_18230936781133176044598070768084230333433368654744509969087239465125979720995 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c140] = %felt_const_16901065971871379877929280081392692752968612240624985552337779093292740763381 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c141] = %felt_const_146494141603558321291767829522948454429758543710648402457451799015963102253 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c142] = %felt_const_2492729278659146790410698334997955258248120870028541691998279257260289595548 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c143] = %felt_const_2204224910006646535594933495262085193210692406133533679934843341237521233504 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c144] = %felt_const_16062117410185840274616925297332331018523844434907012275592638570193234893570 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c145] = %felt_const_5894928453677122829055071981254202951712129328678534592916926069506935491729 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c146] = %felt_const_4947482739415078212217504789923078546034438919537985740403824517728200332286 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c147] = %felt_const_16143265650645676880461646123844627780378251900510645261875867423498913438066 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c148] = %felt_const_397690828254561723549349897112473766901585444153303054845160673059519614409 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c149] = %felt_const_11272653598912269895509621181205395118899451234151664604248382803490621227687 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c150] = %felt_const_15566927854306879444693061574322104423426072650522411176731130806720753591030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c151] = %felt_const_14222898219492484180162096141564251903058269177856173968147960855133048449557 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c152] = %felt_const_16690275395485630428127725067513114066329712673106153451801968992299636791385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c153] = %felt_const_3667030990325966886479548860429670833692690972701471494757671819017808678584 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c154] = %felt_const_21280039024501430842616328642522421302481259067470872421086939673482530783142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c155] = %felt_const_15895485136902450169492923978042129726601461603404514670348703312850236146328 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c156] = %felt_const_7733050956302327984762132317027414325566202380840692458138724610131603812560 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c157] = %felt_const_438123800976401478772659663183448617575635636575786782566035096946820525816 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c158] = %felt_const_814913922521637742587885320797606426167962526342166512693085292151314976633 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c159] = %felt_const_12368712287081330853637674140264759478736012797026621876924395982504369598764 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c160] = %felt_const_2494806857395134874309386694756263421445039103814920780777601708371037591569 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c161] = %felt_const_16101132301514338989512946061786320637179843435886825102406248183507106312877 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c162] = %felt_const_6252650284989960032925831409804233477770646333900692286731621844532438095656 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c163] = %felt_const_9277135875276787021836189566799935097400042171346561246305113339462708861695 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c164] = %felt_const_10493603554686607050979497281838644324893776154179810893893660722522945589063 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c165] = %felt_const_8673089750662709235894359384294076697329948991010184356091130382437645649279 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c166] = %felt_const_9558393272910366944245875920138649617479779893610128634419086981339060613250 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c167] = %felt_const_19012287860122586147374214541764572282814469237161122489573881644994964647218 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c168] = %felt_const_9783723818270121678386992630754842961728702994964214799008457449989291229500 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c169] = %felt_const_15550788416669474113213749561488122552422887538676036667630838378023479382689 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c170] = %felt_const_15016165746156232864069722572047169071786333815661109750860165034341572904221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c171] = %felt_const_6506225705710197163670556961299945987488979904603689017479840649664564978574 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c172] = %felt_const_10796631184889302076168355684722130903785890709107732067446714470783437829037 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c173] = %felt_const_19871836214837460419845806980869387567383718044439891735114283113359312279540 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c174] = %felt_const_20871081766843466343749609089986071784031203517506781251203251608363835140622 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c175] = %felt_const_5100105771517691442278432864090229416166996183792075307747582375962855820797 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c176] = %felt_const_8777887112076272395250620301071581171386440850451972412060638225741125310886 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c177] = %felt_const_5300440870136391278944213332144327695659161151625757537632832724102670898756 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c178] = %felt_const_1205448543652932944633962232545707633928124666868453915721030884663332604536 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c179] = %felt_const_5542499997310181530432302492142574333860449305424174466698068685590909336771 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c180] = %felt_const_11028094245762332275225364962905938096659249161369092798505554939952525894293 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c181] = %felt_const_19187314764836593118404597958543112407224947638377479622725713735224279297009 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c182] = %felt_const_17047263688548829001253658727764731047114098556534482052135734487985276987385 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c183] = %felt_const_19914849528178967155534624144358541535306360577227460456855821557421213606310 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c184] = %felt_const_2929658084700714257515872921366736697080475676508114973627124569375444665664 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c185] = %felt_const_15092262360719700162343163278648422751610766427236295023221516498310468956361 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c186] = %felt_const_21578580340755653236050830649990190843552802306886938815497471545814130084980 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c187] = %felt_const_1258781501221760320019859066036073675029057285507345332959539295621677296991 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c188] = %felt_const_3819598418157732134449049289585680301176983019643974929528867686268702720163 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c189] = %felt_const_8653175945487997845203439345797943132543211416447757110963967501177317426221 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c190] = %felt_const_6614652990340435611114076169697104582524566019034036680161902142028967568142 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c191] = %felt_const_19212515502973904821995111796203064175854996071497099383090983975618035391558 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c192] = %felt_const_18664315914479294273286016871365663486061896605232511201418576829062292269769 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c193] = %felt_const_11498264615058604317482574216318586415670903094838791165247179252175768794889 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c194] = %felt_const_10814026414212439999107945133852431304483604215416531759535467355316227331774 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c195] = %felt_const_17566185590731088197064706533119299946752127014428399631467913813769853431107 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c196] = %felt_const_14016139747289624978792446847000951708158212463304817001882956166752906714332 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c197] = %felt_const_8242601581342441750402731523736202888792436665415852106196418942315563860366 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c198] = %felt_const_9244680976345080074252591214216060854998619670381671198295645618515047080988 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c199] = %felt_const_12216779172735125538689875667307129262237123728082657485828359100719208190116 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c200] = %felt_const_10702811721859145441471328511968332847175733707711670171718794132331147396634 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c201] = %felt_const_6479667912792222539919362076122453947926362746906450079329453150607427372979 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c202] = %felt_const_15117544653571553820496948522381772148324367479772362833334593000535648316185 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c203] = %felt_const_6842203153996907264167856337497139692895299874139131328642472698663046726780 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c204] = %felt_const_12732823292801537626009139514048596316076834307941224506504666470961250728055 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c205] = %felt_const_6936272626871035740815028148058841877090860312517423346335878088297448888663 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c206] = %felt_const_17297554111853491139852678417579991271009602631577069694853813331124433680030 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c207] = %felt_const_16641596134749940573104316021365063031319260205559553673368334842484345864859 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c208] = %felt_const_7400481189785154329569470986896455371037813715804007747228648863919991399081 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c209] = %felt_const_2273205422216987330510475127669563545720586464429614439716564154166712854048 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c210] = %felt_const_15162538063742142685306302282127534305212832649282186184583465569986719234456 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c211] = %felt_const_5628039096440332922248578319648483863204530861778160259559031331287721255522 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c212] = %felt_const_16085392195894691829567913404182676871326863890140775376809129785155092531260 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c213] = %felt_const_14227467863135365427954093998621993651369686288941275436795622973781503444257 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c214] = %felt_const_18224457394066545825553407391290108485121649197258948320896164404518684305122 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c215] = %felt_const_274945154732293792784580363548970818611304339008964723447672490026510689427 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c216] = %felt_const_11050822248291117548220126630860474473945266276626263036056336623671308219529 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c217] = %felt_const_2119542016932434047340813757208803962484943912710204325088879681995922344971 : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c220 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = bool.cmp eq(%6, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.or %7, %8 : i1, i1 {product_source = "constrain"} + %10 = scf.if %9 -> (!felt.type<"babybear">) { + scf.yield {product_source = "constrain"} %felt_const_0 : !felt.type<"babybear"> + } else { + %24 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %nondet[%25] : <218 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %26 : !felt.type<"babybear"> + } {product_source = "constrain"} + %11 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %24 = felt.add %arg3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %24 : !felt.type<"babybear"> + } else { + %24 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %4[%25] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %arg3, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.add %27, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %28 : !felt.type<"babybear"> + } {product_source = "constrain"} + %13 = felt.mul %12, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %2[%14] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %17, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %3[%21] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = bool.cmp lt(%6, %felt_const_219) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %23 { + %24 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = scf.if %24 -> (!felt.type<"babybear">) { + scf.yield {product_source = "constrain"} %arg2 : !felt.type<"babybear"> + } else { + %33 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %5[%34] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %35 : !felt.type<"babybear"> + } {product_source = "constrain"} + %26 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.mul %27, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %25, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %4[%30] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %32 { + %33 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %5[%33] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %33 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %4[%34] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %5[%36] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } else { + %24 = array.read %5[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %3[%c219] : <220 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %25, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %4[%c218] : <219 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mimc_test.llzk b/examples/circom-demo/mimc_test.llzk new file mode 100644 index 0000000..157e5eb --- /dev/null +++ b/examples/circom-demo/mimc_test.llzk @@ -0,0 +1,1538 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MiMC7_0::@MiMC7_0<[]>>} { + poly.template @MiMC7_0 { + struct.def @MiMC7_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @t2 : !array.type<91 x !felt.type<"babybear">> + struct.member @t4 : !array.type<91 x !felt.type<"babybear">> + struct.member @t6 : !array.type<91 x !felt.type<"babybear">> + struct.member @t7 : !array.type<90 x !felt.type<"babybear">> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> {product_source = "compute"} + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> {product_source = "compute"} + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> {product_source = "compute"} + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> {product_source = "compute"} + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> {product_source = "compute"} + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> {product_source = "compute"} + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> {product_source = "compute"} + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> {product_source = "compute"} + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> {product_source = "compute"} + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> {product_source = "compute"} + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> {product_source = "compute"} + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> {product_source = "compute"} + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> {product_source = "compute"} + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> {product_source = "compute"} + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> {product_source = "compute"} + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> {product_source = "compute"} + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> {product_source = "compute"} + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> {product_source = "compute"} + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> {product_source = "compute"} + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> {product_source = "compute"} + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> {product_source = "compute"} + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> {product_source = "compute"} + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> {product_source = "compute"} + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> {product_source = "compute"} + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> {product_source = "compute"} + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> {product_source = "compute"} + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> {product_source = "compute"} + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> {product_source = "compute"} + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> {product_source = "compute"} + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> {product_source = "compute"} + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> {product_source = "compute"} + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> {product_source = "compute"} + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> {product_source = "compute"} + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> {product_source = "compute"} + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> {product_source = "compute"} + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> {product_source = "compute"} + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> {product_source = "compute"} + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> {product_source = "compute"} + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> {product_source = "compute"} + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> {product_source = "compute"} + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> {product_source = "compute"} + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> {product_source = "compute"} + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> {product_source = "compute"} + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> {product_source = "compute"} + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> {product_source = "compute"} + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> {product_source = "compute"} + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> {product_source = "compute"} + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> {product_source = "compute"} + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> {product_source = "compute"} + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> {product_source = "compute"} + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> {product_source = "compute"} + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> {product_source = "compute"} + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> {product_source = "compute"} + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> {product_source = "compute"} + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> {product_source = "compute"} + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> {product_source = "compute"} + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> {product_source = "compute"} + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> {product_source = "compute"} + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> {product_source = "compute"} + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> {product_source = "compute"} + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> {product_source = "compute"} + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> {product_source = "compute"} + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> {product_source = "compute"} + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> {product_source = "compute"} + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> {product_source = "compute"} + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> {product_source = "compute"} + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> {product_source = "compute"} + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> {product_source = "compute"} + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> {product_source = "compute"} + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> {product_source = "compute"} + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> {product_source = "compute"} + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> {product_source = "compute"} + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> {product_source = "compute"} + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> {product_source = "compute"} + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> {product_source = "compute"} + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> {product_source = "compute"} + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> {product_source = "compute"} + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> {product_source = "compute"} + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> {product_source = "compute"} + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> {product_source = "compute"} + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> {product_source = "compute"} + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> {product_source = "compute"} + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> {product_source = "compute"} + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> {product_source = "compute"} + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> {product_source = "compute"} + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> {product_source = "compute"} + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> {product_source = "compute"} + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> {product_source = "compute"} + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> {product_source = "compute"} + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> {product_source = "compute"} + %felt_const_90 = felt.const 90 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<90 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_1 = llzk.nondet : !felt.type<"babybear"> {product_source = "compute"} + %nondet_2 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@t2] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@t4] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@t6] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@t7] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_5 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_5[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = scf.for %arg2 = %c0 to %c91 step %c1 iter_args(%arg3 = %nondet_1) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %7 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = scf.if %7 -> (!felt.type<"babybear">) { + %46 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %46 : !felt.type<"babybear"> + } else { + %46 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %nondet_0[%47] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %arg1, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %nondet_4[%50] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.add %49, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %52 : !felt.type<"babybear"> + } {product_source = "compute"} + %9 = felt.mul %8, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%10] = %9 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %nondet_2[%11] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %nondet_2[%13] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.mul %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %nondet[%17] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %nondet_2[%19] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.mul %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%22] = %21 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp lt(%6, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = scf.if %23 -> (!felt.type<"babybear">) { + %46 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %nondet_3[%46] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%49] = %48 : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %arg3 : !felt.type<"babybear"> + } else { + %46 = array.read %nondet_3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %46, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %47, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %48 : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %48 : !felt.type<"babybear"> + } {product_source = "compute"} + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = scf.if %26 -> (!felt.type<"babybear">) { + %46 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %46 : !felt.type<"babybear"> + } else { + %46 = felt.sub %25, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %4[%47] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.add %arg1, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %nondet_5[%50] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.add %49, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %52 : !felt.type<"babybear"> + } {product_source = "constrain"} + %28 = felt.mul %27, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %1[%29] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %1[%31] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %1[%33] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %32, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %2[%36] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %2[%38] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %1[%40] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.mul %39, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %3[%43] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = bool.cmp lt(%25, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %45 { + %46 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %3[%46] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %4[%49] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %46 = array.read %3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %46, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %47, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.yield %24 : !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@t2] = %nondet_2 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t4] = %nondet : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t6] = %nondet_3 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t7] = %nondet_0 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@MiMC7_0::@MiMC7_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> {product_source = "compute"} + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> {product_source = "compute"} + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> {product_source = "compute"} + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> {product_source = "compute"} + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> {product_source = "compute"} + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> {product_source = "compute"} + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> {product_source = "compute"} + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> {product_source = "compute"} + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> {product_source = "compute"} + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> {product_source = "compute"} + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> {product_source = "compute"} + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> {product_source = "compute"} + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> {product_source = "compute"} + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> {product_source = "compute"} + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> {product_source = "compute"} + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> {product_source = "compute"} + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> {product_source = "compute"} + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> {product_source = "compute"} + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> {product_source = "compute"} + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> {product_source = "compute"} + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> {product_source = "compute"} + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> {product_source = "compute"} + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> {product_source = "compute"} + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> {product_source = "compute"} + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> {product_source = "compute"} + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> {product_source = "compute"} + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> {product_source = "compute"} + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> {product_source = "compute"} + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> {product_source = "compute"} + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> {product_source = "compute"} + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> {product_source = "compute"} + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> {product_source = "compute"} + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> {product_source = "compute"} + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> {product_source = "compute"} + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> {product_source = "compute"} + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> {product_source = "compute"} + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> {product_source = "compute"} + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> {product_source = "compute"} + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> {product_source = "compute"} + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> {product_source = "compute"} + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> {product_source = "compute"} + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> {product_source = "compute"} + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> {product_source = "compute"} + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> {product_source = "compute"} + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> {product_source = "compute"} + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> {product_source = "compute"} + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> {product_source = "compute"} + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> {product_source = "compute"} + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> {product_source = "compute"} + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> {product_source = "compute"} + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> {product_source = "compute"} + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> {product_source = "compute"} + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> {product_source = "compute"} + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> {product_source = "compute"} + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> {product_source = "compute"} + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> {product_source = "compute"} + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> {product_source = "compute"} + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> {product_source = "compute"} + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> {product_source = "compute"} + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> {product_source = "compute"} + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> {product_source = "compute"} + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> {product_source = "compute"} + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> {product_source = "compute"} + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> {product_source = "compute"} + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> {product_source = "compute"} + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> {product_source = "compute"} + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> {product_source = "compute"} + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> {product_source = "compute"} + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> {product_source = "compute"} + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> {product_source = "compute"} + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> {product_source = "compute"} + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> {product_source = "compute"} + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> {product_source = "compute"} + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> {product_source = "compute"} + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> {product_source = "compute"} + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> {product_source = "compute"} + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> {product_source = "compute"} + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> {product_source = "compute"} + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> {product_source = "compute"} + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> {product_source = "compute"} + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> {product_source = "compute"} + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> {product_source = "compute"} + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> {product_source = "compute"} + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> {product_source = "compute"} + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> {product_source = "compute"} + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> {product_source = "compute"} + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> {product_source = "compute"} + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> {product_source = "compute"} + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> {product_source = "compute"} + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> {product_source = "compute"} + %felt_const_90 = felt.const 90 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MiMC7_0::@MiMC7_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<90 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_1 = llzk.nondet : !felt.type<"babybear"> {product_source = "compute"} + %nondet_2 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = scf.for %arg2 = %c0 to %c91 step %c1 iter_args(%arg3 = %nondet_1) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = scf.if %2 -> (!felt.type<"babybear">) { + %20 = felt.add %arg1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %20 : !felt.type<"babybear"> + } else { + %20 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %nondet_0[%21] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %arg1, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %nondet_4[%24] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %23, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %26 : !felt.type<"babybear"> + } {product_source = "compute"} + %4 = felt.mul %3, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%5] = %4 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_2[%6] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet_2[%8] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11] = %10 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%12] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %nondet_2[%14] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%17] = %16 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = bool.cmp lt(%1, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = scf.if %18 -> (!felt.type<"babybear">) { + %20 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %nondet_3[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %21, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%23] = %22 : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %arg3 : !felt.type<"babybear"> + } else { + %20 = array.read %nondet_3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.mul %20, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.add %21, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %22 : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %22 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield %19 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@t2] = %nondet_2 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t4] = %nondet : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t6] = %nondet_3 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@t7] = %nondet_0 : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MiMC7_0::@MiMC7_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MiMC7_0::@MiMC7_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 = felt.const 13602139229813231349386885113156901793661719180900395818909719758150455500533 : <"babybear"> {product_source = "constrain"} + %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 = felt.const 18979889247746272055963929241596362599320706910852082477600815822482192194401 : <"babybear"> {product_source = "constrain"} + %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 = felt.const 7594017890037021425366623750593200398174488805473151513558919864633711506220 : <"babybear"> {product_source = "constrain"} + %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 = felt.const 4212716923652881254737947578600828255798948993302968210248673545442808456151 : <"babybear"> {product_source = "constrain"} + %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 = felt.const 10781825404476535814285389902565833897646945212027592373510689209734812292327 : <"babybear"> {product_source = "constrain"} + %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 = felt.const 1702213613534733786921602839210290505213503664731919006932367875629005980493 : <"babybear"> {product_source = "constrain"} + %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 = felt.const 19362583304414853660976404410208489566967618125972377176980367224623492419647 : <"babybear"> {product_source = "constrain"} + %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 = felt.const 16143532858389170960690347742477978826830511669766530042104134302796355145785 : <"babybear"> {product_source = "constrain"} + %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 = felt.const 6465151453746412132599596984628739550147379072443683076388208843341824127379 : <"babybear"> {product_source = "constrain"} + %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 = felt.const 7069216248902547653615508023941692395371990416048967468982099270925308100727 : <"babybear"> {product_source = "constrain"} + %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 = felt.const 18285310723116790056148596536349375622245669010373674803854111592441823052978 : <"babybear"> {product_source = "constrain"} + %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 = felt.const 11971299749478202793661982361798418342615500543489781306376058267926437157297 : <"babybear"> {product_source = "constrain"} + %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 = felt.const 19155651295705203459475805213866664350848604323501251939850063308319753686505 : <"babybear"> {product_source = "constrain"} + %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 = felt.const 20484495168135072493552514219686101965206843697794133766912991150184337935627 : <"babybear"> {product_source = "constrain"} + %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 = felt.const 18120430890549410286417591505529104700901943324772175772035648111937818237369 : <"babybear"> {product_source = "constrain"} + %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 = felt.const 173271062536305557219323722062711383294158572562695717740068656098441040230 : <"babybear"> {product_source = "constrain"} + %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 = felt.const 9262808208636973454201420823766139682381973240743541030659775288508921362724 : <"babybear"> {product_source = "constrain"} + %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 = felt.const 13564695482314888817576351063608519127702411536552857463682060761575100923924 : <"babybear"> {product_source = "constrain"} + %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 = felt.const 10201298324909697255105265958780781450978049256931478989759448189112393506592 : <"babybear"> {product_source = "constrain"} + %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 = felt.const 11803922811376367215191737026157445294481406304781326649717082177394185903907 : <"babybear"> {product_source = "constrain"} + %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 = felt.const 837850695495734270707668553360118467905109360511302468085569220634750561083 : <"babybear"> {product_source = "constrain"} + %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 = felt.const 19596995117319480189066041930051006586888908165330319666010398892494684778526 : <"babybear"> {product_source = "constrain"} + %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 = felt.const 4490242021765793917495398271905043433053432245571325177153467194570741607167 : <"babybear"> {product_source = "constrain"} + %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 = felt.const 10773245783118750721454994239248013870822765715268323522295722350908043393604 : <"babybear"> {product_source = "constrain"} + %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 = felt.const 6129250029437675212264306655559561251995722990149771051304736001195288083309 : <"babybear"> {product_source = "constrain"} + %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 = felt.const 6220784880752427143725783746407285094967584864656399181815603544365010379208 : <"babybear"> {product_source = "constrain"} + %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 = felt.const 6699067738555349409504843460654299019000594109597429103342076743347235369120 : <"babybear"> {product_source = "constrain"} + %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 = felt.const 10232118865851112229330353999139005145127746617219324244541194256766741433339 : <"babybear"> {product_source = "constrain"} + %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 = felt.const 16222384601744433420585982239113457177459602187868460608565289920306145389382 : <"babybear"> {product_source = "constrain"} + %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 = felt.const 845322671528508199439318170916419179535949348988022948153107378280175750024 : <"babybear"> {product_source = "constrain"} + %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 = felt.const 19948974083684238245321361840704327952464170097132407924861169241740046562673 : <"babybear"> {product_source = "constrain"} + %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 = felt.const 4037040458505567977365391535756875199663510397600316887746139396052445718861 : <"babybear"> {product_source = "constrain"} + %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 = felt.const 20806323192073945401862788605803131761175139076694468214027227878952047793390 : <"babybear"> {product_source = "constrain"} + %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 = felt.const 6309765381643925252238633914530877025934201680691496500372265330505506717193 : <"babybear"> {product_source = "constrain"} + %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 = felt.const 2216432659854733047132347621569505613620980842043977268828076165669557467682 : <"babybear"> {product_source = "constrain"} + %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 = felt.const 17386427286863519095301372413760745749282643730629659997153085139065756667205 : <"babybear"> {product_source = "constrain"} + %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 = felt.const 12690713110714036569415168795200156516217175005650145422920562694422306200486 : <"babybear"> {product_source = "constrain"} + %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 = felt.const 20486583726592018813337145844457018474256372770211860618687961310422228379031 : <"babybear"> {product_source = "constrain"} + %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 = felt.const 10530777752259630125564678480897857853807637120039176813174150229243735996839 : <"babybear"> {product_source = "constrain"} + %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 = felt.const 18718569356736340558616379408444812528964066420519677106145092918482774343613 : <"babybear"> {product_source = "constrain"} + %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 = felt.const 11867589662193422187545516240823411225342068709600734253659804646934346124945 : <"babybear"> {product_source = "constrain"} + %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 = felt.const 1823201861560942974198127384034483127920205835821334101215923769688644479957 : <"babybear"> {product_source = "constrain"} + %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 = felt.const 10548274686824425401349248282213580046351514091431715597441736281987273193140 : <"babybear"> {product_source = "constrain"} + %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 = felt.const 19603444733183990109492724100282114612026332366576932662794133334264283907557 : <"babybear"> {product_source = "constrain"} + %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 = felt.const 18177751737739153338153217698774510185696788019377850245260475034576050820091 : <"babybear"> {product_source = "constrain"} + %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 = felt.const 5507959600969845538113649209272736011390582494851145043668969080335346810411 : <"babybear"> {product_source = "constrain"} + %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 = felt.const 10546185249390392695582524554167530669949955276893453512788278945742408153192 : <"babybear"> {product_source = "constrain"} + %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 = felt.const 19240878651604412704364448729659032944342952609050243268894572835672205984837 : <"babybear"> {product_source = "constrain"} + %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 = felt.const 19799686398774806587970184652860783461860993790013219899147141137827718662674 : <"babybear"> {product_source = "constrain"} + %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 = felt.const 5148596049900083984813839872929010525572543381981952060869301611018636120248 : <"babybear"> {product_source = "constrain"} + %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 = felt.const 18884137497114307927425084003812022333609937761793387700010402412840002189451 : <"babybear"> {product_source = "constrain"} + %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 = felt.const 5264534817993325015357427094323255342713527811596856940387954546330728068658 : <"babybear"> {product_source = "constrain"} + %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 = felt.const 13718112532745211817410303291774369209520657938741992779396229864894885156527 : <"babybear"> {product_source = "constrain"} + %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 = felt.const 21211457866117465531949733809706514799713333930924902519246949506964470524162 : <"babybear"> {product_source = "constrain"} + %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 = felt.const 6739722627047123650704294650168547689199576889424317598327664349670094847386 : <"babybear"> {product_source = "constrain"} + %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 = felt.const 8316378125659383262515151597439205374263247719876250938893842106722210729522 : <"babybear"> {product_source = "constrain"} + %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 = felt.const 1744432620323851751204287974553233986555641872755053103823939564833813704825 : <"babybear"> {product_source = "constrain"} + %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 = felt.const 7400123822125662712777833064081316757896757785777291653271747396958201309118 : <"babybear"> {product_source = "constrain"} + %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 = felt.const 14025118133847866722315446277964222215118620050302054655768867040006542798474 : <"babybear"> {product_source = "constrain"} + %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 = felt.const 6032365105133504724925793806318578936233045029919447519826248813478479197288 : <"babybear"> {product_source = "constrain"} + %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 = felt.const 16313562605837709339799839901240652934758303521543693857533755376563489378839 : <"babybear"> {product_source = "constrain"} + %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 = felt.const 2104159799604932521291371026105311735948154964200596636974609406977292675173 : <"babybear"> {product_source = "constrain"} + %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 = felt.const 250710584458582618659378487568129931785810765264752039738223488321597070280 : <"babybear"> {product_source = "constrain"} + %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 = felt.const 8486711143589723036499933521576871883500223198263343024003617825616410932026 : <"babybear"> {product_source = "constrain"} + %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 = felt.const 4653317306466493184743870159523234588955994456998076243468148492375236846006 : <"babybear"> {product_source = "constrain"} + %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 = felt.const 3446968588058668564420958894889124905706353937375068998436129414772610003289 : <"babybear"> {product_source = "constrain"} + %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 = felt.const 10035653564014594269791753415727486340557376923045841607746250017541686319774 : <"babybear"> {product_source = "constrain"} + %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 = felt.const 10864774797625152707517901967943775867717907803542223029967000416969007792571 : <"babybear"> {product_source = "constrain"} + %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 = felt.const 13061236261277650370863439564453267964462486225679643020432589226741411380501 : <"babybear"> {product_source = "constrain"} + %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 = felt.const 16703465144013840124940690347975638755097486902749048533167980887413919317592 : <"babybear"> {product_source = "constrain"} + %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 = felt.const 19825444354178182240559170937204690272111734703605805530888940813160705385792 : <"babybear"> {product_source = "constrain"} + %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 = felt.const 8536471869378957766675292398190944925664113548202769136103887479787957959589 : <"babybear"> {product_source = "constrain"} + %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 = felt.const 3067001377342968891237590775929219083706800062321980129409398033259904188058 : <"babybear"> {product_source = "constrain"} + %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 = felt.const 12663821244032248511491386323242575231591777785787269938928497649288048289525 : <"babybear"> {product_source = "constrain"} + %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 = felt.const 8360838254132998143349158726141014535383109403565779450210746881879715734773 : <"babybear"> {product_source = "constrain"} + %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 = felt.const 11482807709115676646560379017491661435505951727793345550942389701970904563183 : <"babybear"> {product_source = "constrain"} + %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 = felt.const 17691411851977575435597871505860208507285462834710151833948561098560743654671 : <"babybear"> {product_source = "constrain"} + %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 = felt.const 2632385916954580941368956176626336146806721642583847728103570779270161510514 : <"babybear"> {product_source = "constrain"} + %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 = felt.const 5040699236106090655289931820723926657076483236860546282406111821875672148900 : <"babybear"> {product_source = "constrain"} + %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 = felt.const 19647356996769918391113967168615123299113119185942498194367262335168397100658 : <"babybear"> {product_source = "constrain"} + %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 = felt.const 4614037031668406927330683909387957156531244689520944789503628527855167665518 : <"babybear"> {product_source = "constrain"} + %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 = felt.const 17029914891543225301403832095880481731551830725367286980611178737703889171730 : <"babybear"> {product_source = "constrain"} + %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 = felt.const 3262966573163560839685415914157855077211340576201936620532175028036746741754 : <"babybear"> {product_source = "constrain"} + %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 = felt.const 11189978595292752354820141775598510151189959177917284797737745690127318076389 : <"babybear"> {product_source = "constrain"} + %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 = felt.const 2558901189096558760448896669327086721003508630712968559048179091037845349145 : <"babybear"> {product_source = "constrain"} + %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 = felt.const 11442588683664344394633565859260176446561886575962616332903193988751292992472 : <"babybear"> {product_source = "constrain"} + %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 = felt.const 1374324219480165500871639364801692115397519265181803854177629327624133579404 : <"babybear"> {product_source = "constrain"} + %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 = felt.const 8334177627492981984476504167502758309043212251641796197711684499645635709656 : <"babybear"> {product_source = "constrain"} + %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 = felt.const 15265126113435022738560151911929040668591755459209400716467504685752745317193 : <"babybear"> {product_source = "constrain"} + %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 = felt.const 20888961410941983456478427210666206549300505294776164667214940546594746570981 : <"babybear"> {product_source = "constrain"} + %felt_const_90 = felt.const 90 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@MiMC7_0::@MiMC7_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@t2] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@t4] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@t6] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %arg0[@t7] : <@MiMC7_0::@MiMC7_0<[]>>, !array.type<90 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<91 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c64] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c65] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c66] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c67] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c68] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c69] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c70] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c71] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c72] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c73] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c74] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c75] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c76] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c77] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c78] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c79] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c80] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c81] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c82] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c83] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c84] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c85] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c86] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c87] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c88] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c89] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c90] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_20888961410941983456478427210666206549300505294776164667214940546594746570981 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_15265126113435022738560151911929040668591755459209400716467504685752745317193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_8334177627492981984476504167502758309043212251641796197711684499645635709656 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_1374324219480165500871639364801692115397519265181803854177629327624133579404 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_11442588683664344394633565859260176446561886575962616332903193988751292992472 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_2558901189096558760448896669327086721003508630712968559048179091037845349145 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_11189978595292752354820141775598510151189959177917284797737745690127318076389 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_3262966573163560839685415914157855077211340576201936620532175028036746741754 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_17029914891543225301403832095880481731551830725367286980611178737703889171730 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_4614037031668406927330683909387957156531244689520944789503628527855167665518 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_19647356996769918391113967168615123299113119185942498194367262335168397100658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_5040699236106090655289931820723926657076483236860546282406111821875672148900 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_2632385916954580941368956176626336146806721642583847728103570779270161510514 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_17691411851977575435597871505860208507285462834710151833948561098560743654671 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_11482807709115676646560379017491661435505951727793345550942389701970904563183 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_8360838254132998143349158726141014535383109403565779450210746881879715734773 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_12663821244032248511491386323242575231591777785787269938928497649288048289525 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_3067001377342968891237590775929219083706800062321980129409398033259904188058 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_8536471869378957766675292398190944925664113548202769136103887479787957959589 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_19825444354178182240559170937204690272111734703605805530888940813160705385792 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_16703465144013840124940690347975638755097486902749048533167980887413919317592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_13061236261277650370863439564453267964462486225679643020432589226741411380501 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_10864774797625152707517901967943775867717907803542223029967000416969007792571 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_10035653564014594269791753415727486340557376923045841607746250017541686319774 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_3446968588058668564420958894889124905706353937375068998436129414772610003289 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_4653317306466493184743870159523234588955994456998076243468148492375236846006 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_8486711143589723036499933521576871883500223198263343024003617825616410932026 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_250710584458582618659378487568129931785810765264752039738223488321597070280 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_2104159799604932521291371026105311735948154964200596636974609406977292675173 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_16313562605837709339799839901240652934758303521543693857533755376563489378839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_6032365105133504724925793806318578936233045029919447519826248813478479197288 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_14025118133847866722315446277964222215118620050302054655768867040006542798474 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_7400123822125662712777833064081316757896757785777291653271747396958201309118 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_1744432620323851751204287974553233986555641872755053103823939564833813704825 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_8316378125659383262515151597439205374263247719876250938893842106722210729522 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_6739722627047123650704294650168547689199576889424317598327664349670094847386 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_21211457866117465531949733809706514799713333930924902519246949506964470524162 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_13718112532745211817410303291774369209520657938741992779396229864894885156527 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_5264534817993325015357427094323255342713527811596856940387954546330728068658 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_18884137497114307927425084003812022333609937761793387700010402412840002189451 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_5148596049900083984813839872929010525572543381981952060869301611018636120248 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_19799686398774806587970184652860783461860993790013219899147141137827718662674 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_19240878651604412704364448729659032944342952609050243268894572835672205984837 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_10546185249390392695582524554167530669949955276893453512788278945742408153192 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_5507959600969845538113649209272736011390582494851145043668969080335346810411 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_18177751737739153338153217698774510185696788019377850245260475034576050820091 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_19603444733183990109492724100282114612026332366576932662794133334264283907557 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_10548274686824425401349248282213580046351514091431715597441736281987273193140 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_1823201861560942974198127384034483127920205835821334101215923769688644479957 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_11867589662193422187545516240823411225342068709600734253659804646934346124945 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_18718569356736340558616379408444812528964066420519677106145092918482774343613 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_10530777752259630125564678480897857853807637120039176813174150229243735996839 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_20486583726592018813337145844457018474256372770211860618687961310422228379031 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_12690713110714036569415168795200156516217175005650145422920562694422306200486 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_17386427286863519095301372413760745749282643730629659997153085139065756667205 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_2216432659854733047132347621569505613620980842043977268828076165669557467682 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_6309765381643925252238633914530877025934201680691496500372265330505506717193 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_20806323192073945401862788605803131761175139076694468214027227878952047793390 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_4037040458505567977365391535756875199663510397600316887746139396052445718861 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_19948974083684238245321361840704327952464170097132407924861169241740046562673 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_845322671528508199439318170916419179535949348988022948153107378280175750024 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_16222384601744433420585982239113457177459602187868460608565289920306145389382 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_10232118865851112229330353999139005145127746617219324244541194256766741433339 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c64] = %felt_const_6699067738555349409504843460654299019000594109597429103342076743347235369120 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c65] = %felt_const_6220784880752427143725783746407285094967584864656399181815603544365010379208 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c66] = %felt_const_6129250029437675212264306655559561251995722990149771051304736001195288083309 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c67] = %felt_const_10773245783118750721454994239248013870822765715268323522295722350908043393604 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c68] = %felt_const_4490242021765793917495398271905043433053432245571325177153467194570741607167 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c69] = %felt_const_19596995117319480189066041930051006586888908165330319666010398892494684778526 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c70] = %felt_const_837850695495734270707668553360118467905109360511302468085569220634750561083 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c71] = %felt_const_11803922811376367215191737026157445294481406304781326649717082177394185903907 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c72] = %felt_const_10201298324909697255105265958780781450978049256931478989759448189112393506592 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c73] = %felt_const_13564695482314888817576351063608519127702411536552857463682060761575100923924 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c74] = %felt_const_9262808208636973454201420823766139682381973240743541030659775288508921362724 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c75] = %felt_const_173271062536305557219323722062711383294158572562695717740068656098441040230 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c76] = %felt_const_18120430890549410286417591505529104700901943324772175772035648111937818237369 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c77] = %felt_const_20484495168135072493552514219686101965206843697794133766912991150184337935627 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c78] = %felt_const_19155651295705203459475805213866664350848604323501251939850063308319753686505 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c79] = %felt_const_11971299749478202793661982361798418342615500543489781306376058267926437157297 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c80] = %felt_const_18285310723116790056148596536349375622245669010373674803854111592441823052978 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c81] = %felt_const_7069216248902547653615508023941692395371990416048967468982099270925308100727 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c82] = %felt_const_6465151453746412132599596984628739550147379072443683076388208843341824127379 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c83] = %felt_const_16143532858389170960690347742477978826830511669766530042104134302796355145785 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c84] = %felt_const_19362583304414853660976404410208489566967618125972377176980367224623492419647 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c85] = %felt_const_1702213613534733786921602839210290505213503664731919006932367875629005980493 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c86] = %felt_const_10781825404476535814285389902565833897646945212027592373510689209734812292327 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c87] = %felt_const_4212716923652881254737947578600828255798948993302968210248673545442808456151 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c88] = %felt_const_7594017890037021425366623750593200398174488805473151513558919864633711506220 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c89] = %felt_const_18979889247746272055963929241596362599320706910852082477600815822482192194401 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c90] = %felt_const_13602139229813231349386885113156901793661719180900395818909719758150455500533 : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c91 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp eq(%5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.if %6 -> (!felt.type<"babybear">) { + %26 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %26 : !felt.type<"babybear"> + } else { + %26 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %4[%27] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %nondet[%30] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %29, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %32 : !felt.type<"babybear"> + } {product_source = "constrain"} + %8 = felt.mul %7, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%9] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %1[%11] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%13] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %1[%20] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %19, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %3[%23] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp lt(%5, %felt_const_90) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %25 { + %26 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.mul %27, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %4[%29] : <90 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %26 = array.read %3[%c90] : <91 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.mul %26, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.add %27, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mnist_convnet_test.llzk b/examples/circom-demo/mnist_convnet_test.llzk new file mode 100644 index 0000000..8b4a60d --- /dev/null +++ b/examples/circom-demo/mnist_convnet_test.llzk @@ -0,0 +1,5095 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@mnist_convnet_21::@mnist_convnet_21<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg0[%2, %3] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10] = %8 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = cast.toindex %2 : !felt.type<"babybear"> + %5 = array.read %arg1[%3, %4] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg2[%6, %7] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<9 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %nondet[%9] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %arg0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %arg4 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + %2 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %7 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = cast.toindex %8 : !felt.type<"babybear"> + %16 = array.read %arg1[%14, %15] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %arg5 : !felt.type<"babybear"> + %19 = array.read %1[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %10 : !felt.type<"babybear"> + } + scf.yield %7 : !felt.type<"babybear"> + } + %5 = array.read %1[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<1 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %self = struct.new : <@Sum_2::@Sum_2<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_3 { + struct.def @Conv2D_3 { + struct.member @out : !array.type<26,26,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c18 = arith.constant 18 : index + %c9 = arith.constant 9 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> + %nondet = llzk.nondet : !array.type<26,26,4 x !felt.type<"babybear">> + %array = array.new : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %c0, %arg5] = %0 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %c0, %arg5] = %0 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_2 = array.new : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %arg5] = %0 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_4 = array.new : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %5 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %8, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%7, %10, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + %15 = array.read %array_2[%12, %13, %c0, %14] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %17 = cast.toindex %3 : !felt.type<"babybear"> + %18 = cast.toindex %4 : !felt.type<"babybear"> + array.write %16[%17, %18] = %11 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %0 : !felt.type<"babybear"> + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = cast.toindex %2 : !felt.type<"babybear"> + %22 = array.read %array_2[%19, %20, %c0, %21] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %22[@a] = %16 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_2[%23, %24, %c0, %25] = %22 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %array_1[%26, %27, %c0, %28] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %58 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %59 = pod.read %22[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %60 = function.call @matElemMul_0::@matElemMul_0::@compute(%58, %59) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %29[@comp] = %60 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_1[%61, %62, %c0, %63] = %29 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %33 = cast.toindex %3 : !felt.type<"babybear"> + %34 = cast.toindex %4 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %arg1[%33, %34, %c0, %35] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = cast.toindex %2 : !felt.type<"babybear"> + %40 = array.read %array_2[%37, %38, %c0, %39] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %41 = pod.read %40[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %42 = cast.toindex %3 : !felt.type<"babybear"> + %43 = cast.toindex %4 : !felt.type<"babybear"> + array.write %41[%42, %43] = %36 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %0 : !felt.type<"babybear"> + %45 = cast.toindex %1 : !felt.type<"babybear"> + %46 = cast.toindex %2 : !felt.type<"babybear"> + %47 = array.read %array_2[%44, %45, %c0, %46] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %47[@b] = %41 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %48 = cast.toindex %0 : !felt.type<"babybear"> + %49 = cast.toindex %1 : !felt.type<"babybear"> + %50 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_2[%48, %49, %c0, %50] = %47 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + %53 = cast.toindex %2 : !felt.type<"babybear"> + %54 = array.read %array_1[%51, %52, %c0, %53] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %55 = pod.read %54[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %56 = arith.subi %55, %c1 : index + pod.write %54[@count] = %56 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %57 = arith.cmpi eq, %56, %c0 : index + scf.if %57 { + %58 = pod.read %47[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %59 = pod.read %47[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %60 = function.call @matElemMul_0::@matElemMul_0::@compute(%58, %59) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %54[@comp] = %60 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_1[%61, %62, %c0, %63] = %54 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %array_1[%5, %6, %c0, %7] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %10 = struct.readm %9[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = array.read %10[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = array.read %array_0[%14, %15, %c0, %16] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %19 = cast.toindex %3 : !felt.type<"babybear"> + %20 = cast.toindex %4 : !felt.type<"babybear"> + array.write %18[%19, %20] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = cast.toindex %2 : !felt.type<"babybear"> + %24 = array.read %array_0[%21, %22, %c0, %23] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %24[@a] = %18 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = cast.toindex %1 : !felt.type<"babybear"> + %27 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%25, %26, %c0, %27] = %24 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = cast.toindex %1 : !felt.type<"babybear"> + %30 = cast.toindex %2 : !felt.type<"babybear"> + %31 = array.read %array[%28, %29, %c0, %30] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %35 = pod.read %24[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %36 = function.call @matElemSum_1::@matElemSum_1::@compute(%35) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %31[@comp] = %36 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%37, %38, %c0, %39] = %31 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %15 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%15) + } do { + %15 = cast.toindex %0 : !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = cast.toindex %2 : !felt.type<"babybear"> + %18 = array.read %array[%15, %16, %c0, %17] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %20 = struct.readm %19[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = cast.toindex %2 : !felt.type<"babybear"> + %24 = array.read %array_4[%21, %22, %23] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %25 = pod.read %24[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + array.write %25[%c0] = %20 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %array_4[%26, %27, %28] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + pod.write %29[@in] = %25 : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %30 = cast.toindex %0 : !felt.type<"babybear"> + %31 = cast.toindex %1 : !felt.type<"babybear"> + %32 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_4[%30, %31, %32] = %29 : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %array_3[%33, %34, %35] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %29[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %41 = function.call @Sum_2::@Sum_2::@compute(%40) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + pod.write %36[@comp] = %41 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %42 = cast.toindex %0 : !felt.type<"babybear"> + %43 = cast.toindex %1 : !felt.type<"babybear"> + %44 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_3[%42, %43, %44] = %36 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array_3[%3, %4, %5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = struct.readm %7[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%12, %13, %14] = %11 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_5 = array.new : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_5[%arg3, %arg4, %c0, %arg5] = %1 : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@mul$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_6 = array.new : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_6[%arg3, %arg4, %c0, %arg5] = %1 : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + } + struct.writem %self[@mul] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@sum$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %array_7 = array.new : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + array.write %array_7[%arg3, %arg4, %arg5] = %1 : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + } + } + } + struct.writem %self[@sum] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + %6 = struct.readm %arg0[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c26 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c26 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %12 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%14, %17, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %7 : !felt.type<"babybear"> + %20 = cast.toindex %8 : !felt.type<"babybear"> + %21 = cast.toindex %9 : !felt.type<"babybear"> + %22 = array.read %4[%19, %20, %c0, %21] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %23 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %24 = cast.toindex %10 : !felt.type<"babybear"> + %25 = cast.toindex %11 : !felt.type<"babybear"> + %26 = array.read %23[%24, %25] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %10 : !felt.type<"babybear"> + %28 = cast.toindex %11 : !felt.type<"babybear"> + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = array.read %arg2[%27, %28, %c0, %29] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %7 : !felt.type<"babybear"> + %32 = cast.toindex %8 : !felt.type<"babybear"> + %33 = cast.toindex %9 : !felt.type<"babybear"> + %34 = array.read %4[%31, %32, %c0, %33] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %35 = pod.read %34[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %36 = cast.toindex %10 : !felt.type<"babybear"> + %37 = cast.toindex %11 : !felt.type<"babybear"> + %38 = array.read %35[%36, %37] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %12 = cast.toindex %7 : !felt.type<"babybear"> + %13 = cast.toindex %8 : !felt.type<"babybear"> + %14 = cast.toindex %9 : !felt.type<"babybear"> + %15 = array.read %3[%12, %13, %c0, %14] : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %16 = struct.readm %15[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %17 = cast.toindex %10 : !felt.type<"babybear"> + %18 = cast.toindex %11 : !felt.type<"babybear"> + %19 = array.read %16[%17, %18] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %7 : !felt.type<"babybear"> + %21 = cast.toindex %8 : !felt.type<"babybear"> + %22 = cast.toindex %9 : !felt.type<"babybear"> + %23 = array.read %2[%20, %21, %c0, %22] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %24 = pod.read %23[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %11 : !felt.type<"babybear"> + %27 = array.read %24[%25, %26] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %22 = bool.cmp lt(%arg7, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%22) + } do { + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = cast.toindex %9 : !felt.type<"babybear"> + %25 = array.read %1[%22, %23, %c0, %24] : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %26 = struct.readm %25[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %27 = cast.toindex %7 : !felt.type<"babybear"> + %28 = cast.toindex %8 : !felt.type<"babybear"> + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = array.read %6[%27, %28, %29] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %31 = pod.read %30[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %32 = array.read %31[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %10 = cast.toindex %7 : !felt.type<"babybear"> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %5[%10, %11, %12] : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %arg3[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %0[%18, %19, %20] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %1[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %2[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %3[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %4[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6] : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = array.read %6[%arg4, %arg5, %arg6] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @matElemSum_4 { + struct.def @matElemSum_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_4::@matElemSum_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@matElemSum_4::@matElemSum_4<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %arg0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %arg4 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_4::@matElemSum_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_4::@matElemSum_4<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_4::@matElemSum_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_4::@matElemSum_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_4::@matElemSum_4<[]>>, !array.type<4 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %7 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = cast.toindex %8 : !felt.type<"babybear"> + %16 = array.read %arg1[%14, %15] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %arg5 : !felt.type<"babybear"> + %19 = array.read %1[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %10 : !felt.type<"babybear"> + } + scf.yield %7 : !felt.type<"babybear"> + } + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @SumPooling2D_5 { + struct.def @SumPooling2D_5 { + struct.member @out : !array.type<13,13,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + struct.member @elemSum$inputs : !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c13 = arith.constant 13 : index + %self = struct.new : <@SumPooling2D_5::@SumPooling2D_5<[]>> + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> + %array = array.new : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1, %arg2, %arg3] = %0 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg1 = %c0 to %c13 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c13 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %arg0[%16, %19, %20] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = array.read %array_0[%22, %23, %24] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %27 = cast.toindex %12 : !felt.type<"babybear"> + %28 = cast.toindex %13 : !felt.type<"babybear"> + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_0[%29, %30, %31] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%33, %34, %35] = %32 : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array[%36, %37, %38] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %44 = function.call @matElemSum_4::@matElemSum_4::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_4::@matElemSum_4<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%45, %46, %47] = %39 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + } + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array[%3, %4, %5] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_4::@matElemSum_4<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9, %10, %11] = %8 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + struct.writem %self[@out] = %nondet : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c13 = arith.constant 13 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c13 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %arg1[%19, %22, %23] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = cast.toindex %4 : !felt.type<"babybear"> + %27 = cast.toindex %5 : !felt.type<"babybear"> + %28 = array.read %2[%25, %26, %27] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %30 = cast.toindex %15 : !felt.type<"babybear"> + %31 = cast.toindex %16 : !felt.type<"babybear"> + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %1[%6, %7, %8] : <13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %10 = struct.readm %9[@out] : <@matElemSum_4::@matElemSum_4<[]>>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %0[%11, %12, %13] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <13,13,4 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %4 = array.read %2[%arg2, %arg3, %arg4] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + function.call @matElemSum_4::@matElemSum_4::@constrain(%3, %5) : (!struct.type<@matElemSum_4::@matElemSum_4<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @Sum_6 { + struct.def @Sum_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<4 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Sum_6::@Sum_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Sum_6::@Sum_6<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c1 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %2 : !felt.type<"babybear"> + %7 = array.read %arg0[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %1 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_6::@Sum_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_6::@Sum_6<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_6::@Sum_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_6::@Sum_6<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Sum_6::@Sum_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_6::@Sum_6<[]>>, !array.type<4 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = array.read %1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_7 { + struct.def @Conv2D_7 { + struct.member @out : !array.type<11,11,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @sum : !array.type<11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>> + struct.member @sum$inputs : !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @elemSum : !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<13,13,4 x !felt.type<"babybear">>, %arg1: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %c9 = arith.constant 9 : index + %c18 = arith.constant 18 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c11 = arith.constant 11 : index + %self = struct.new : <@Conv2D_7::@Conv2D_7<[]>> + %nondet = llzk.nondet : !array.type<11,11,8 x !felt.type<"babybear">> + %array = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %arg5] = %0 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %array_1 = array.new : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %arg5, %arg6] = %0 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_2 = array.new : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %arg5, %arg6] = %0 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_4 = array.new : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %6 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = array.read %arg0[%8, %11, %12] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = cast.toindex %3 : !felt.type<"babybear"> + %18 = array.read %array_2[%14, %15, %16, %17] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %20 = cast.toindex %4 : !felt.type<"babybear"> + %21 = cast.toindex %5 : !felt.type<"babybear"> + array.write %19[%20, %21] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = array.read %array_2[%22, %23, %24, %25] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %26[@a] = %19 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %27 = cast.toindex %0 : !felt.type<"babybear"> + %28 = cast.toindex %1 : !felt.type<"babybear"> + %29 = cast.toindex %2 : !felt.type<"babybear"> + %30 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_2[%27, %28, %29, %30] = %26 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %31 = cast.toindex %0 : !felt.type<"babybear"> + %32 = cast.toindex %1 : !felt.type<"babybear"> + %33 = cast.toindex %2 : !felt.type<"babybear"> + %34 = cast.toindex %3 : !felt.type<"babybear"> + %35 = array.read %array_1[%31, %32, %33, %34] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.subi %36, %c1 : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.cmpi eq, %37, %c0 : index + scf.if %38 { + %69 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %70 = pod.read %26[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %35[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %72 = cast.toindex %0 : !felt.type<"babybear"> + %73 = cast.toindex %1 : !felt.type<"babybear"> + %74 = cast.toindex %2 : !felt.type<"babybear"> + %75 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_1[%72, %73, %74, %75] = %35 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %39 = cast.toindex %4 : !felt.type<"babybear"> + %40 = cast.toindex %5 : !felt.type<"babybear"> + %41 = cast.toindex %2 : !felt.type<"babybear"> + %42 = cast.toindex %3 : !felt.type<"babybear"> + %43 = array.read %arg1[%39, %40, %41, %42] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %0 : !felt.type<"babybear"> + %45 = cast.toindex %1 : !felt.type<"babybear"> + %46 = cast.toindex %2 : !felt.type<"babybear"> + %47 = cast.toindex %3 : !felt.type<"babybear"> + %48 = array.read %array_2[%44, %45, %46, %47] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %49 = pod.read %48[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %50 = cast.toindex %4 : !felt.type<"babybear"> + %51 = cast.toindex %5 : !felt.type<"babybear"> + array.write %49[%50, %51] = %43 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = cast.toindex %0 : !felt.type<"babybear"> + %53 = cast.toindex %1 : !felt.type<"babybear"> + %54 = cast.toindex %2 : !felt.type<"babybear"> + %55 = cast.toindex %3 : !felt.type<"babybear"> + %56 = array.read %array_2[%52, %53, %54, %55] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %56[@b] = %49 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %57 = cast.toindex %0 : !felt.type<"babybear"> + %58 = cast.toindex %1 : !felt.type<"babybear"> + %59 = cast.toindex %2 : !felt.type<"babybear"> + %60 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_2[%57, %58, %59, %60] = %56 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + %64 = cast.toindex %3 : !felt.type<"babybear"> + %65 = array.read %array_1[%61, %62, %63, %64] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %66 = pod.read %65[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %67 = arith.subi %66, %c1 : index + pod.write %65[@count] = %67 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %68 = arith.cmpi eq, %67, %c0 : index + scf.if %68 { + %69 = pod.read %56[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %70 = pod.read %56[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %65[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %72 = cast.toindex %0 : !felt.type<"babybear"> + %73 = cast.toindex %1 : !felt.type<"babybear"> + %74 = cast.toindex %2 : !felt.type<"babybear"> + %75 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_1[%72, %73, %74, %75] = %65 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %array_1[%6, %7, %8, %9] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = array.read %12[%13, %14] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = cast.toindex %2 : !felt.type<"babybear"> + %19 = cast.toindex %3 : !felt.type<"babybear"> + %20 = array.read %array_4[%16, %17, %18, %19] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %22 = cast.toindex %4 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + array.write %21[%22, %23] = %15 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %0 : !felt.type<"babybear"> + %25 = cast.toindex %1 : !felt.type<"babybear"> + %26 = cast.toindex %2 : !felt.type<"babybear"> + %27 = cast.toindex %3 : !felt.type<"babybear"> + %28 = array.read %array_4[%24, %25, %26, %27] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %28[@a] = %21 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_4[%29, %30, %31, %32] = %28 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = cast.toindex %3 : !felt.type<"babybear"> + %37 = array.read %array_3[%33, %34, %35, %36] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %41 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %42 = function.call @matElemSum_1::@matElemSum_1::@compute(%41) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %37[@comp] = %42 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + %44 = cast.toindex %1 : !felt.type<"babybear"> + %45 = cast.toindex %2 : !felt.type<"babybear"> + %46 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_3[%43, %44, %45, %46] = %37 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + } + scf.for %arg5 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %15 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = cast.toindex %2 : !felt.type<"babybear"> + %20 = array.read %array_3[%16, %17, %18, %19] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %22 = struct.readm %21[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + %26 = array.read %array_0[%23, %24, %25] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %28 = cast.toindex %15 : !felt.type<"babybear"> + array.write %27[%28] = %22 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_0[%29, %30, %31] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + pod.write %32[@in] = %27 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%33, %34, %35] = %32 : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array[%36, %37, %38] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %44 = function.call @Sum_6::@Sum_6::@compute(%43) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Sum_6::@Sum_6<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_6::@Sum_6<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%45, %46, %47] = %39 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]> + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array[%3, %4, %5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_6::@Sum_6<[]>> + %8 = struct.readm %7[@out] : <@Sum_6::@Sum_6<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%12, %13, %14] = %11 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@mul$inputs] = %array_2 : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_5 = array.new : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %1 : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + } + } + struct.writem %self[@mul] = %array_5 : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@sum$inputs] = %array_0 : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %array_6 = array.new : <11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_6::@Sum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_6::@Sum_6<[]>> + array.write %array_6[%arg3, %arg4, %arg5] = %1 : <11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>>, !struct.type<@Sum_6::@Sum_6<[]>> + } + } + } + struct.writem %self[@sum] = %array_6 : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>> + struct.writem %self[@elemSum$inputs] = %array_4 : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_7 = array.new : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_7[%arg3, %arg4, %arg5, %arg6] = %1 : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + } + } + struct.writem %self[@elemSum] = %array_7 : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_7::@Conv2D_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, %arg1: !array.type<13,13,4 x !felt.type<"babybear">>, %arg2: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg3: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c4 = arith.constant 4 : index + %c11 = arith.constant 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@sum] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>> + %2 = struct.readm %arg0[@sum$inputs] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@mul] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@mul$inputs] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@elemSum] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %6 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c11 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c11 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c8 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %13 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = cast.toindex %9 : !felt.type<"babybear"> + %20 = array.read %arg1[%15, %18, %19] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %7 : !felt.type<"babybear"> + %22 = cast.toindex %8 : !felt.type<"babybear"> + %23 = cast.toindex %9 : !felt.type<"babybear"> + %24 = cast.toindex %10 : !felt.type<"babybear"> + %25 = array.read %4[%21, %22, %23, %24] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %27 = cast.toindex %11 : !felt.type<"babybear"> + %28 = cast.toindex %12 : !felt.type<"babybear"> + %29 = array.read %26[%27, %28] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %11 : !felt.type<"babybear"> + %31 = cast.toindex %12 : !felt.type<"babybear"> + %32 = cast.toindex %9 : !felt.type<"babybear"> + %33 = cast.toindex %10 : !felt.type<"babybear"> + %34 = array.read %arg2[%30, %31, %32, %33] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = cast.toindex %7 : !felt.type<"babybear"> + %36 = cast.toindex %8 : !felt.type<"babybear"> + %37 = cast.toindex %9 : !felt.type<"babybear"> + %38 = cast.toindex %10 : !felt.type<"babybear"> + %39 = array.read %4[%35, %36, %37, %38] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %40 = pod.read %39[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %41 = cast.toindex %11 : !felt.type<"babybear"> + %42 = cast.toindex %12 : !felt.type<"babybear"> + %43 = array.read %40[%41, %42] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = cast.toindex %8 : !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = cast.toindex %10 : !felt.type<"babybear"> + %17 = array.read %3[%13, %14, %15, %16] : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = cast.toindex %12 : !felt.type<"babybear"> + %21 = array.read %18[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = cast.toindex %9 : !felt.type<"babybear"> + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = array.read %6[%22, %23, %24, %25] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %27 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %28 = cast.toindex %11 : !felt.type<"babybear"> + %29 = cast.toindex %12 : !felt.type<"babybear"> + %30 = array.read %27[%28, %29] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + } + scf.for %arg6 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %23 = cast.toindex %7 : !felt.type<"babybear"> + %24 = cast.toindex %8 : !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = cast.toindex %9 : !felt.type<"babybear"> + %27 = array.read %5[%23, %24, %25, %26] : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %29 = cast.toindex %7 : !felt.type<"babybear"> + %30 = cast.toindex %8 : !felt.type<"babybear"> + %31 = cast.toindex %9 : !felt.type<"babybear"> + %32 = array.read %2[%29, %30, %31] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %33 = pod.read %32[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %34 = cast.toindex %22 : !felt.type<"babybear"> + %35 = array.read %33[%34] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = cast.toindex %7 : !felt.type<"babybear"> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %1[%10, %11, %12] : <11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>>, !struct.type<@Sum_6::@Sum_6<[]>> + %14 = struct.readm %13[@out] : <@Sum_6::@Sum_6<[]>>, !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %arg3[%15] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %0[%18, %19, %20] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + scf.for %arg7 = %c0 to %c8 step %c1 { + %7 = array.read %3[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %4[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %7 = array.read %1[%arg4, %arg5, %arg6] : <11,11,8 x !struct.type<@Sum_6::@Sum_6<[]>>>, !struct.type<@Sum_6::@Sum_6<[]>> + %8 = array.read %2[%arg4, %arg5, %arg6] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + function.call @Sum_6::@Sum_6::@constrain(%7, %9) : (!struct.type<@Sum_6::@Sum_6<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + scf.for %arg7 = %c0 to %c8 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %6[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + } + function.return + } + } + } + poly.template @SumPooling2D_8 { + struct.def @SumPooling2D_8 { + struct.member @out : !array.type<5,5,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + struct.member @elemSum$inputs : !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c5 = arith.constant 5 : index + %self = struct.new : <@SumPooling2D_8::@SumPooling2D_8<[]>> + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> + %array = array.new : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1, %arg2, %arg3] = %0 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg1 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %arg0[%16, %19, %20] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = array.read %array_0[%22, %23, %24] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %27 = cast.toindex %12 : !felt.type<"babybear"> + %28 = cast.toindex %13 : !felt.type<"babybear"> + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_0[%29, %30, %31] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%33, %34, %35] = %32 : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array[%36, %37, %38] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %44 = function.call @matElemSum_4::@matElemSum_4::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_4::@matElemSum_4<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%45, %46, %47] = %39 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + } + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array[%3, %4, %5] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_4::@matElemSum_4<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9, %10, %11] = %8 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_4::@matElemSum_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + struct.writem %self[@out] = %nondet : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c5 = arith.constant 5 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %arg1[%19, %22, %23] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = cast.toindex %4 : !felt.type<"babybear"> + %27 = cast.toindex %5 : !felt.type<"babybear"> + %28 = array.read %2[%25, %26, %27] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %30 = cast.toindex %15 : !felt.type<"babybear"> + %31 = cast.toindex %16 : !felt.type<"babybear"> + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %1[%6, %7, %8] : <5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %10 = struct.readm %9[@out] : <@matElemSum_4::@matElemSum_4<[]>>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %0[%11, %12, %13] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c5 step %c1 { + scf.for %arg4 = %c0 to %c8 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <5,5,8 x !struct.type<@matElemSum_4::@matElemSum_4<[]>>>, !struct.type<@matElemSum_4::@matElemSum_4<[]>> + %4 = array.read %2[%arg2, %arg3, %arg4] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + function.call @matElemSum_4::@matElemSum_4::@constrain(%3, %5) : (!struct.type<@matElemSum_4::@matElemSum_4<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @Flatten2D_9 { + struct.def @Flatten2D_9 { + struct.member @out : !array.type<200 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4:2 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7:2 = scf.for %arg7 = %c0 to %c8 step %c1 iter_args(%arg8 = %arg5, %arg9 = %arg6) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%9, %10, %11] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %arg8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %arg8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%16, %17, %18] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%20] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %14, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %7#0, %7#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %4#0, %4#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> + } + function.def @compute(%arg0: !array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.for %arg3 = %c0 to %c5 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg5 = %c0 to %c8 step %c1 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%6, %7, %8] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %2 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, %arg1: !array.type<5,5,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = scf.for %arg6 = %c0 to %c8 step %c1 iter_args(%arg7 = %arg5) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %arg7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %5 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %3 : !felt.type<"babybear"> + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @matElemMul_10 { + struct.def @matElemMul_10 { + struct.member @out : !array.type<1,200 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>, %arg1: !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_10::@matElemMul_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_10::@matElemMul_10<[]>> + %nondet = llzk.nondet : !array.type<1,200 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c200 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_10::@matElemMul_10<[]>>, !array.type<1,200 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_10::@matElemMul_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>, %arg2: !array.type<1,200 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_10::@matElemMul_10<[]>>, !array.type<1,200 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c200 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_11 { + struct.def @matElemSum_11 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<200 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_11::@matElemSum_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c199 = arith.constant 199 : index + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_11::@matElemSum_11<[]>> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c200 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c199] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_11::@matElemSum_11<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_11::@matElemSum_11<[]>>, !array.type<200 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_11::@matElemSum_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_11::@matElemSum_11<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_11::@matElemSum_11<[]>>, !array.type<200 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c200 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c199] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_12 { + struct.def @matMul_12 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>, %arg1: !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_12::@matMul_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c400 = arith.constant 400 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_12::@matMul_12<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c200 : <[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c400 : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %16 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %32 = function.call @matElemMul_10::@matElemMul_10::@compute(%30, %31) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_10::@matElemMul_10<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + array.write %array_1[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %26 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %32 = function.call @matElemMul_10::@matElemMul_10::@compute(%30, %31) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_10::@matElemMul_10<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + array.write %array_1[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_10::@matElemMul_10<[]>>, !array.type<1,200 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %19 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %24 = function.call @matElemSum_11::@matElemSum_11::@compute(%23) : (!array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_11::@matElemSum_11<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_11::@matElemSum_11<[]>> + array.write %array[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_11::@matElemSum_11<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_11::@matElemSum_11<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemMulComp$inputs] = %array_2 : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>> + %2 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_10::@matElemMul_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + struct.writem %self[@matElemMulComp] = %array_3 : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>> + struct.writem %self[@matElemSumComp$inputs] = %array_0 : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>> + %4 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_11::@matElemSum_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_11::@matElemSum_11<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>>, !struct.type<@matElemSum_11::@matElemSum_11<[]>> + struct.writem %self[@matElemSumComp] = %array_4 : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_12::@matMul_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_12::@matMul_12<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>, %arg2: !array.type<200,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemSumComp] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>> + %2 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemMulComp] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>> + %4 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c200 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c200 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_10::@matElemMul_10<[]>>, !array.type<1,200 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>>, !struct.type<@matElemSum_11::@matElemSum_11<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_11::@matElemSum_11<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_10::@matElemMul_10<[]>>>, !struct.type<@matElemMul_10::@matElemMul_10<[]>> + %6 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + function.call @matElemMul_10::@matElemMul_10::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_10::@matElemMul_10<[]>>, !array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> () + %9 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_11::@matElemSum_11<[]>>>, !struct.type<@matElemSum_11::@matElemSum_11<[]>> + %10 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %11 = pod.read %10[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + function.call @matElemSum_11::@matElemSum_11::@constrain(%9, %11) : (!struct.type<@matElemSum_11::@matElemSum_11<[]>>, !array.type<1,200 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_13 { + struct.def @Dense_13 { + struct.member @out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<10 x !struct.type<@matMul_12::@matMul_12<[]>>> + struct.member @dot$inputs : !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<200 x !felt.type<"babybear">>, %arg1: !array.type<200,10 x !felt.type<"babybear">>, %arg2: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c200 = arith.constant 200 : index + %c400 = arith.constant 400 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %self = struct.new : <@Dense_13::@Dense_13<[]>> + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + %array = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c400 : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3] = %0 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c200 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %arg0[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %15 = pod.read %14[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %16 = cast.toindex %10 : !felt.type<"babybear"> + array.write %15[%c0, %16] = %12 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %array_0[%17] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + pod.write %18[@a] = %15 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %19 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%19] = %18 : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = array.read %array[%20] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %40 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %41 = pod.read %18[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %42 = function.call @matMul_12::@matMul_12::@compute(%40, %41) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_12::@matMul_12<[]>> + pod.write %21[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_12::@matMul_12<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %21 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + } + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = array.read %arg1[%25, %26] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %30 = pod.read %29[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %31 = cast.toindex %10 : !felt.type<"babybear"> + array.write %30[%31, %c0] = %27 : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + %33 = array.read %array_0[%32] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + pod.write %33[@b] = %30 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %34 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%34] = %33 : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %35 = cast.toindex %0 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %41 = pod.read %33[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %42 = function.call @matMul_12::@matMul_12::@compute(%40, %41) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_12::@matMul_12<[]>> + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_12::@matMul_12<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %36 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + } + } + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_12::@matMul_12<[]>> + %4 = struct.readm %3[@out] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %5 = array.read %4[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %arg2[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <10 x !struct.type<@matMul_12::@matMul_12<[]>>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_12::@matMul_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_12::@matMul_12<[]>> + array.write %array_1[%arg3] = %1 : <10 x !struct.type<@matMul_12::@matMul_12<[]>>>, !struct.type<@matMul_12::@matMul_12<[]>> + } + struct.writem %self[@dot] = %array_1 : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !struct.type<@matMul_12::@matMul_12<[]>>> + struct.writem %self[@out] = %nondet : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> + function.return %self : !struct.type<@Dense_13::@Dense_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_13::@Dense_13<[]>>, %arg1: !array.type<200 x !felt.type<"babybear">>, %arg2: !array.type<200,10 x !felt.type<"babybear">>, %arg3: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c200 = arith.constant 200 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %0 = struct.readm %arg0[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@dot] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !struct.type<@matMul_12::@matMul_12<[]>>> + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c200 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = array.read %arg1[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %19 = cast.toindex %13 : !felt.type<"babybear"> + %20 = array.read %18[%c0, %19] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %13 : !felt.type<"babybear"> + %22 = cast.toindex %3 : !felt.type<"babybear"> + %23 = array.read %arg2[%21, %22] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %3 : !felt.type<"babybear"> + %25 = array.read %2[%24] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %26 = pod.read %25[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %27 = cast.toindex %13 : !felt.type<"babybear"> + %28 = array.read %26[%27, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <10 x !struct.type<@matMul_12::@matMul_12<[]>>>, !struct.type<@matMul_12::@matMul_12<[]>> + %6 = struct.readm %5[@out] : <@matMul_12::@matMul_12<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg3[%8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %0[%11] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = array.read %1[%arg4] : <10 x !struct.type<@matMul_12::@matMul_12<[]>>>, !struct.type<@matMul_12::@matMul_12<[]>> + %4 = array.read %2[%arg4] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + function.call @matMul_12::@matMul_12::@constrain(%3, %5, %6) : (!struct.type<@matMul_12::@matMul_12<[]>>, !array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @Num2Bits_14 { + struct.def @Num2Bits_14 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_15 { + struct.def @LessThan_15 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_14::@Num2Bits_14::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + %26 = function.call @Num2Bits_14::@Num2Bits_14::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_15::@LessThan_15<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_15::@LessThan_15<[]>>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_15::@LessThan_15<[]>>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_15::@LessThan_15<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_14::@Num2Bits_14::@constrain(%13, %23) : (!struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_15::@LessThan_15<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_14::@Num2Bits_14::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_15::@LessThan_15<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_15::@LessThan_15<[]>>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_15::@LessThan_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_15::@LessThan_15<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_15::@LessThan_15<[]>>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_15::@LessThan_15<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_14::@Num2Bits_14::@constrain(%1, %11) : (!struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_16 { + struct.def @GreaterThan_16 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_15::@LessThan_15<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_15::@LessThan_15::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> + %26 = function.call @LessThan_15::@LessThan_15::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_15::@LessThan_15::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_16::@GreaterThan_16<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_16::@GreaterThan_16<[]>>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_16::@GreaterThan_16<[]>>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_16::@GreaterThan_16<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_15::@LessThan_15::@constrain(%14, %23) : (!struct.type<@LessThan_15::@LessThan_15<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_15::@LessThan_15::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_15::@LessThan_15::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_16::@GreaterThan_16<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_15::@LessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_16::@GreaterThan_16<[]>>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_16::@GreaterThan_16<[]>>, !struct.type<@LessThan_15::@LessThan_15<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_16::@GreaterThan_16<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_15::@LessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_15::@LessThan_15::@constrain(%1, %10) : (!struct.type<@LessThan_15::@LessThan_15<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_17 { + struct.def @Switcher_17 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_17::@Switcher_17<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_17::@Switcher_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_17::@Switcher_17<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ArgMax_18 { + struct.def @ArgMax_18 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<11 x !felt.type<"babybear">> + struct.member @amaxs : !array.type<11 x !felt.type<"babybear">> + struct.member @aswitchers : !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> + struct.member @aswitchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @gts : !array.type<10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> + struct.member @gts$inputs : !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @switchers : !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> + struct.member @switchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_18::@ArgMax_18<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %15 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c1] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %136 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_16::@GreaterThan_16::@product(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> + %138 = function.call @GreaterThan_16::@GreaterThan_16::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + pod.write %25[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %139 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%139] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg0[%29] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_3[%31] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c0] = %30 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%34] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@in] = %33 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%36] = %35 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_2[%37] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %136 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_16::@GreaterThan_16::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + pod.write %38[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %138 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%138] = %38 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_2[%42] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_5[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@sel] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_4[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %136 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_17::@Switcher_17::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %53[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %nondet[%57] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_5[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@L] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_4[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %136 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_17::@Switcher_17::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %66[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %arg0[%70] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_5[%73] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %74[@R] = %71 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%76] = %74 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %77 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + %79 = array.read %array_4[%78] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %81 = arith.subi %80, %c1 {product_source = "compute"} : index + pod.write %79[@count] = %81 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %82 = arith.cmpi eq, %81, %c0 {product_source = "compute"} : index + scf.if %82 { + %136 = pod.read %74[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %74[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %74[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_17::@Switcher_17::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %79[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %79 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %83 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array_2[%83] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_1[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@sel] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %136 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_17::@Switcher_17::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %94[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %nondet_0[%98] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_1[%101] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %102[@L] = %99 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %103 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%104] = %102 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %105 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + %107 = array.read %array[%106] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %108 = pod.read %107[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %109 = arith.subi %108, %c1 {product_source = "compute"} : index + pod.write %107[@count] = %109 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %110 = arith.cmpi eq, %109, %c0 {product_source = "compute"} : index + scf.if %110 { + %136 = pod.read %102[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %102[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %102[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_17::@Switcher_17::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %107[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %107 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %111 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + %113 = array.read %array_1[%112] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %113[@R] = %15 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%115] = %113 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %116 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %120 = arith.subi %119, %c1 {product_source = "compute"} : index + pod.write %118[@count] = %120 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %121 = arith.cmpi eq, %120, %c0 {product_source = "compute"} : index + scf.if %121 { + %136 = pod.read %113[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %113[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %113[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_17::@Switcher_17::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %118[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %118 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %122 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %122 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %array[%123] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %125 = pod.read %124[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %126 = struct.readm %125[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %127 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%128] = %126 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %129 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "compute"} + %131 = array.read %array_4[%130] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %132 = pod.read %131[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %133 = struct.readm %132[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %134 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %135 = cast.toindex %134 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%135] = %133 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet_0[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_5 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %16 : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_1 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %16 : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_7 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_3 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_8 = array.new : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %16 : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_8 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet_0 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@amaxs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@aswitchers] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@aswitchers$inputs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %self[@gts] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> {product_source = "constrain"} + %8 = struct.readm %self[@gts$inputs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %9 = struct.readm %self[@switchers] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "constrain"} + %10 = struct.readm %self[@switchers$inputs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %11 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %3[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %4[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %3[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %8[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg0[%22] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %8[%24] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %26[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %7[%28] : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %10[%32] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %3[%35] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %10[%38] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %arg0[%41] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %10[%44] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %7[%47] : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "constrain"} + %49 = struct.readm %48[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %6[%51] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %4[%54] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %6[%57] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %59 = pod.read %58[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %6[%61] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %63 = pod.read %62[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %5[%65] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %67 = struct.readm %66[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %4[%69] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %70, %67 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %9[%72] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %74 = struct.readm %73[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %3[%76] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = array.read %4[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %9[%arg1] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %16 = array.read %10[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_17::@Switcher_17::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %5[%arg1] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %16 = array.read %6[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_17::@Switcher_17::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %7[%arg1] : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "constrain"} + %16 = array.read %8[%arg1] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_16::@GreaterThan_16::@constrain(%15, %17) : (!struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@ArgMax_18::@ArgMax_18<[]>> + } + function.def @compute(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_18::@ArgMax_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %2 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_3[%5] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_3[%8] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%10] = %9 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_2[%11] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %123 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_16::@GreaterThan_16::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + pod.write %12[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%125] = %12 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %123 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_16::@GreaterThan_16::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + pod.write %25[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%125] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_2[%29] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_5[%34] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%37] = %35 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_4[%39] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %123 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_17::@Switcher_17::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %40[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %40 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_5[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_4[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %123 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_17::@Switcher_17::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %53[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_5[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_4[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %123 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_17::@Switcher_17::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %66[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_2[%70] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %72 = pod.read %71[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_1[%75] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %76[@sel] = %73 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%78] = %76 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %79 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%80] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %81[@count] = %83 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %123 = pod.read %76[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %76[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %76[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_17::@Switcher_17::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %81[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %81 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %85 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %nondet_0[%85] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_1[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@L] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %123 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_17::@Switcher_17::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %94[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %array_1[%99] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %100[@R] = %2 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%102] = %100 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %103 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array[%104] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %123 = pod.read %100[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %100[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %100[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_17::@Switcher_17::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + pod.write %105[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %105 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %109 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %109 : !felt.type<"babybear"> {product_source = "compute"} + %111 = array.read %array[%110] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %112 = pod.read %111[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %113 = struct.readm %112[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%115] = %113 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %116 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array_4[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + %120 = struct.readm %119[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %121 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %121 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%122] = %120 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet_0[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_5 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %3 : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_1 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_17::@Switcher_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %3 : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_7 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_3 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_8 = array.new : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %3 : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_8 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet_0 : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ArgMax_18::@ArgMax_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, %arg1: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant {product_source = "constrain"} 10 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@amaxs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@aswitchers] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aswitchers$inputs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@gts] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@gts$inputs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@switchers] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !struct.type<@Switcher_17::@Switcher_17<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@switchers$inputs] : <@ArgMax_18::@ArgMax_18<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = array.read %arg1[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %2[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %1[%14] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %6[%16] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%20] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %6[%22] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %5[%26] : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %8[%30] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %1[%33] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %8[%36] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg1[%39] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %8[%42] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45] : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@GreaterThan_16::@GreaterThan_16<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %4[%49] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %2[%52] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %4[%55] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %4[%59] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %61 = pod.read %60[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %3[%63] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %65 = struct.readm %64[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %2[%67] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %7[%70] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@outL] : <@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %1[%74] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %75, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %2[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %7[%arg2] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %14 = array.read %8[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_17::@Switcher_17::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %3[%arg2] : <11 x !struct.type<@Switcher_17::@Switcher_17<[]>>>, !struct.type<@Switcher_17::@Switcher_17<[]>> {product_source = "constrain"} + %14 = array.read %4[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_17::@Switcher_17::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_17::@Switcher_17<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = array.read %5[%arg2] : <10 x !struct.type<@GreaterThan_16::@GreaterThan_16<[]>>>, !struct.type<@GreaterThan_16::@GreaterThan_16<[]>> {product_source = "constrain"} + %14 = array.read %6[%arg2] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_16::@GreaterThan_16::@constrain(%13, %15) : (!struct.type<@GreaterThan_16::@GreaterThan_16<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Poly_19 { + struct.def @Poly_19 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_19::@Poly_19<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1000000 = felt.const 1000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_19::@Poly_19<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg0, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Poly_19::@Poly_19<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_19::@Poly_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1000000 = felt.const 1000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_19::@Poly_19<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Poly_19::@Poly_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@Poly_19::@Poly_19<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1000000 = felt.const 1000000 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.mul %arg1, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Poly_20 { + struct.def @Poly_20 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_20::@Poly_20<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1000000000000000 = felt.const 1000000000000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_20::@Poly_20<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg0, %felt_const_1000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Poly_20::@Poly_20<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_20::@Poly_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1000000000000000 = felt.const 1000000000000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_20::@Poly_20<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Poly_20::@Poly_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@Poly_20::@Poly_20<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1000000000000000 = felt.const 1000000000000000 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.mul %arg1, %felt_const_1000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @mnist_convnet_21 { + struct.def @mnist_convnet_21 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @dense_out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @conv2d_2 : !struct.type<@Conv2D_7::@Conv2D_7<[]>> + struct.member @conv2d_2$inputs : !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> + struct.member @conv2d_1 : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + struct.member @conv2d_1$inputs : !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> + struct.member @sum2d_1 : !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> + struct.member @sum2d_1$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + struct.member @dense : !struct.type<@Dense_13::@Dense_13<[]>> + struct.member @dense$inputs : !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> + struct.member @poly_1 : !array.type<26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> + struct.member @poly_1$inputs : !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @flatten : !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> + struct.member @flatten$inputs : !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> + struct.member @argmax : !struct.type<@ArgMax_18::@ArgMax_18<[]>> + struct.member @argmax$inputs : !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> + struct.member @sum2d_2 : !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> + struct.member @sum2d_2$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + struct.member @poly_2 : !array.type<11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> + struct.member @poly_2$inputs : !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg4: !array.type<8 x !felt.type<"babybear">>, %arg5: !array.type<200,10 x !felt.type<"babybear">>, %arg6: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_convnet_21::@mnist_convnet_21<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c968 = arith.constant {product_source = "compute"} 968 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c200 = arith.constant {product_source = "compute"} 200 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %c2210 = arith.constant {product_source = "compute"} 2210 : index + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %c824 = arith.constant {product_source = "compute"} 824 : index + %c972 = arith.constant {product_source = "compute"} 972 : index + %self = struct.new : <@mnist_convnet_21::@mnist_convnet_21<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c972 } : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c824 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2210 } : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c26 step %c1 { + scf.for %arg8 = %c0 to %c26 step %c1 { + scf.for %arg9 = %c0 to %c4 step %c1 { + %43 = array.read %array[%arg7, %arg8, %arg9] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %43[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg7, %arg8, %arg9] = %43 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_7 = array.new : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_8 = pod.new { @count = %c200 } : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_9 = pod.new : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_10 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_11 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_12 = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_13 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_14 = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c11 step %c1 { + scf.for %arg8 = %c0 to %c11 step %c1 { + scf.for %arg9 = %c0 to %c8 step %c1 { + %43 = array.read %array_14[%arg7, %arg8, %arg9] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %43[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_14[%arg7, %arg8, %arg9] = %43 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_15 = array.new : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c28 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c28 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %arg0[%45, %46, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49, %50, %c0] = %47 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %48 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %52 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %57 = function.call @Conv2D_3::@Conv2D_3::@compute(%54, %55, %56) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %57 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %51 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %52 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %arg1[%53, %54, %c0, %55] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %57[%58, %59, %c0, %60] = %56 : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@weights] = %57 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %61 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.subi %61, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %62 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.cmpi eq, %62, %c0 {product_source = "compute"} : index + scf.if %63 { + %64 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %66 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %67 = function.call @Conv2D_3::@Conv2D_3::@compute(%64, %65, %66) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %67 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg2[%44] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@bias] = %46 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %49 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %51 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @Conv2D_3::@Conv2D_3::@compute(%51, %52, %53) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %54 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c26 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c26 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %47 = struct.readm %46[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %47[%48, %49, %50] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_7[%52, %53, %54] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %55[@in] = %51 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_7[%56, %57, %58] = %55 : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %59 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array[%59, %60, %61] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %63 = pod.read %62[@count] : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %62[@count] = %64 : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %79 = pod.read %55[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Poly_19::@Poly_19::@product(%79) : (!felt.type<"babybear">) -> !struct.type<@Poly_19::@Poly_19<[]>> + %81 = function.call @Poly_19::@Poly_19::@compute(%79) : (!felt.type<"babybear">) -> !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + pod.write %62[@comp] = %80 : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + %82 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%82, %83, %84] = %62 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %66 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %array[%66, %67, %68] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %70 = pod.read %69[@comp] : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + %71 = struct.readm %70[@out] : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_4[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %72[%73, %74, %75] = %71 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %72 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %77 : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %79 = pod.read %pod_4[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @SumPooling2D_5::@SumPooling2D_5::@compute(%79) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c13 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c13 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + %47 = struct.readm %46[@out] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %47[%48, %49, %50] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53, %54, %55] = %51 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %52 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %57 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %59 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %61 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %62 = function.call @Conv2D_7::@Conv2D_7::@compute(%59, %60, %61) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %62 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %51 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %52 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg10 = %c0 to %c4 step %c1 { + %53 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg3[%54, %55, %56, %57] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %59[%60, %61, %62, %63] = %58 : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@weights] = %59 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %65 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %67 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %69 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %70 = function.call @Conv2D_7::@Conv2D_7::@compute(%67, %68, %69) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %70 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg4[%44] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@bias] = %46 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %49 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %51 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @Conv2D_7::@Conv2D_7::@compute(%51, %52, %53) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %54 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c11 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c11 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c8 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + %47 = struct.readm %46[@out] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %47[%48, %49, %50] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_15[%52, %53, %54] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %55[@in] = %51 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_15[%56, %57, %58] = %55 : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %59 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array_14[%59, %60, %61] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %63 = pod.read %62[@count] : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %62[@count] = %64 : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %79 = pod.read %55[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %80 = function.call @Poly_20::@Poly_20::@product(%79) : (!felt.type<"babybear">) -> !struct.type<@Poly_20::@Poly_20<[]>> + %81 = function.call @Poly_20::@Poly_20::@compute(%79) : (!felt.type<"babybear">) -> !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + pod.write %62[@comp] = %80 : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + %82 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_14[%82, %83, %84] = %62 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %66 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %array_14[%66, %67, %68] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %70 = pod.read %69[@comp] : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + %71 = struct.readm %70[@out] : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_13[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %72[%73, %74, %75] = %71 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_13[@in] = %72 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_12[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %pod_12[@count] = %77 : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %79 = pod.read %pod_13[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @SumPooling2D_8::@SumPooling2D_8::@compute(%79) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + pod.write %pod_12[@comp] = %80 : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c5 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c5 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c8 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + %47 = struct.readm %46[@out] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %47[%48, %49, %50] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %pod_9[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53, %54, %55] = %51 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_9[@in] = %52 : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_8[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %pod_8[@count] = %57 : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %59 = pod.read %pod_9[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = function.call @Flatten2D_9::@Flatten2D_9::@product(%59) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> + %61 = function.call @Flatten2D_9::@Flatten2D_9::@compute(%59) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + pod.write %pod_8[@comp] = %60 : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c200 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %48 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %51 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @Dense_13::@Dense_13::@compute(%53, %54, %55) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %56 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg8 = %c0 to %c10 step %c1 { + %53 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %arg5[%54, %55] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + array.write %57[%58, %59] = %56 : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@weights] = %57 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %61 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Dense_13::@Dense_13::@compute(%63, %64, %65) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %66 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg6[%44] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@bias] = %46 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %49 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %51 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @Dense_13::@Dense_13::@compute(%51, %52, %53) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %54 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%48] = %47 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + %50 = struct.readm %49[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %50[%51] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = pod.read %pod_11[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %53[%54] = %52 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_11[@in] = %53 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_10[@count] : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.subi %55, %c1 {product_source = "compute"} : index + pod.write %pod_10[@count] = %56 : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.cmpi eq, %56, %c0 {product_source = "compute"} : index + scf.if %57 { + %58 = pod.read %pod_11[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %59 = function.call @ArgMax_18::@ArgMax_18::@product(%58) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_18::@ArgMax_18<[]>> + %60 = function.call @ArgMax_18::@ArgMax_18::@compute(%58) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + pod.write %pod_10[@comp] = %59 : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_10[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_9 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %2 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + struct.writem %self[@poly_2$inputs] = %array_15 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_16 = array.new : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c11 step %c1 { + scf.for %arg8 = %c0 to %c11 step %c1 { + scf.for %arg9 = %c0 to %c8 step %c1 { + %43 = array.read %array_14[%arg7, %arg8, %arg9] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + array.write %array_16[%arg7, %arg8, %arg9] = %44 : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_2] = %array_16 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> {product_source = "compute"} + struct.writem %self[@sum2d_2$inputs] = %pod_13 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + struct.writem %self[@sum2d_2] = %3 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1$inputs] = %pod_2 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1] = %4 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_11 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_10[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %5 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_6 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %6 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2$inputs] = %pod_0 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2] = %7 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + struct.writem %self[@sum2d_1$inputs] = %pod_4 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + struct.writem %self[@sum2d_1] = %8 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + struct.writem %self[@poly_1$inputs] = %array_7 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_17 = array.new : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c26 step %c1 { + scf.for %arg8 = %c0 to %c26 step %c1 { + scf.for %arg9 = %c0 to %c4 step %c1 { + %43 = array.read %array[%arg7, %arg8, %arg9] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + array.write %array_17[%arg7, %arg8, %arg9] = %44 : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_1] = %array_17 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@dense_out] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = struct.readm %self[@conv2d_2] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@conv2d_2$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %self[@conv2d_1] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@conv2d_1$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %self[@sum2d_1] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@sum2d_1$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %self[@dense] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@dense$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %self[@poly_1] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> {product_source = "constrain"} + %20 = struct.readm %self[@poly_1$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %21 = struct.readm %self[@flatten] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "constrain"} + %22 = struct.readm %self[@flatten$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %self[@argmax] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "constrain"} + %24 = struct.readm %self[@argmax$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %self[@sum2d_2] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "constrain"} + %26 = struct.readm %self[@sum2d_2$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %self[@poly_2] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> {product_source = "constrain"} + %28 = struct.readm %self[@poly_2$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c28 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c28 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %arg0[%45, %46, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = pod.read %14[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %48[%49, %50, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %49 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %50 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %arg1[%51, %52, %c0, %53] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = pod.read %14[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %55[%56, %57, %c0, %58] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg2[%44] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %14[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %46[%47] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c26 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c26 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %46 = struct.readm %13[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %46[%47, %48, %49] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %20[%51, %52, %53] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %55 = pod.read %54[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %19[%56, %57, %58] : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "constrain"} + %60 = struct.readm %59[@out] : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %61 = pod.read %16[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %61[%62, %63, %64] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %60 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c13 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c13 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %46 = struct.readm %15[@out] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %46[%47, %48, %49] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = pod.read %12[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %51[%52, %53, %54] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %49 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %50 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c4 step %c1 { + %51 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %arg3[%52, %53, %54, %55] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = pod.read %12[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %57[%58, %59, %60, %61] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %62, %56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg4[%44] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %12[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %46[%47] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c11 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c11 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c8 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %46 = struct.readm %11[@out] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %46[%47, %48, %49] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %28[%51, %52, %53] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %55 = pod.read %54[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %27[%56, %57, %58] : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "constrain"} + %60 = struct.readm %59[@out] : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %61 = pod.read %26[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %61[%62, %63, %64] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %60 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c5 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c5 step %c1 { + %44 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c8 step %c1 { + %45 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %46 = struct.readm %25[@out] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %46[%47, %48, %49] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = pod.read %22[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %51[%52, %53, %54] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c200 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = struct.readm %21[@out] : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %44[%45] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %18[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c10 step %c1 { + %50 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %arg5[%51, %52] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = pod.read %18[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %54[%55, %56] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg6[%44] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %18[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %46[%47] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %43 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = struct.readm %17[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %44[%45] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %10[%47] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = struct.readm %17[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %49[%50] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %24[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %29 = struct.readm %23[@out] : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %22[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_9::@Flatten2D_9::@constrain(%21, %30) : (!struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<5,5,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg7 = %c0 to %c11 step %c1 { + scf.for %arg8 = %c0 to %c11 step %c1 { + scf.for %arg9 = %c0 to %c8 step %c1 { + %43 = array.read %27[%arg7, %arg8, %arg9] : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "constrain"} + %44 = array.read %28[%arg7, %arg8, %arg9] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_20::@Poly_20::@constrain(%43, %45) : (!struct.type<@Poly_20::@Poly_20<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %31 = pod.read %26[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_8::@SumPooling2D_8::@constrain(%25, %31) : (!struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %32 = pod.read %14[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = pod.read %14[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = pod.read %14[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%13, %32, %33, %34) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %35 = pod.read %24[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_18::@ArgMax_18::@constrain(%23, %35) : (!struct.type<@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %36 = pod.read %18[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %18[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = pod.read %18[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_13::@Dense_13::@constrain(%17, %36, %37, %38) : (!struct.type<@Dense_13::@Dense_13<[]>>, !array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %39 = pod.read %12[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = pod.read %12[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = pod.read %12[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_7::@Conv2D_7::@constrain(%11, %39, %40, %41) : (!struct.type<@Conv2D_7::@Conv2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %42 = pod.read %16[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_5::@SumPooling2D_5::@constrain(%15, %42) : (!struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg7 = %c0 to %c26 step %c1 { + scf.for %arg8 = %c0 to %c26 step %c1 { + scf.for %arg9 = %c0 to %c4 step %c1 { + %43 = array.read %19[%arg7, %arg8, %arg9] : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "constrain"} + %44 = array.read %20[%arg7, %arg8, %arg9] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_19::@Poly_19::@constrain(%43, %45) : (!struct.type<@Poly_19::@Poly_19<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@mnist_convnet_21::@mnist_convnet_21<[]>> + } + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg4: !array.type<8 x !felt.type<"babybear">>, %arg5: !array.type<200,10 x !felt.type<"babybear">>, %arg6: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_convnet_21::@mnist_convnet_21<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c968 = arith.constant {product_source = "compute"} 968 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c200 = arith.constant {product_source = "compute"} 200 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %c2210 = arith.constant {product_source = "compute"} 2210 : index + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %c824 = arith.constant {product_source = "compute"} 824 : index + %c972 = arith.constant {product_source = "compute"} 972 : index + %self = struct.new : <@mnist_convnet_21::@mnist_convnet_21<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c972 } : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c824 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2210 } : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c26 step %c1 { + scf.for %arg8 = %c0 to %c26 step %c1 { + scf.for %arg9 = %c0 to %c4 step %c1 { + %9 = array.read %array[%arg7, %arg8, %arg9] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg7, %arg8, %arg9] = %9 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_7 = array.new : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_8 = pod.new { @count = %c200 } : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_9 = pod.new : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_10 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_11 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_12 = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_13 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_14 = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c11 step %c1 { + scf.for %arg8 = %c0 to %c11 step %c1 { + scf.for %arg9 = %c0 to %c8 step %c1 { + %9 = array.read %array_14[%arg7, %arg8, %arg9] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_14[%arg7, %arg8, %arg9] = %9 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_15 = array.new : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c28 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c28 step %c1 { + %10 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15, %16, %c0] = %13 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %14 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @Conv2D_3::@Conv2D_3::@compute(%20, %21, %22) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %17 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %18 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg1[%19, %20, %c0, %21] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24, %25, %c0, %26] = %22 : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@weights] = %23 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %28 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %30 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %33 = function.call @Conv2D_3::@Conv2D_3::@compute(%30, %31, %32) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %33 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg2[%10] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@bias] = %12 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %15 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_2[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_2[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_2[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @Conv2D_3::@Conv2D_3::@compute(%17, %18, %19) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %20 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c26 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c26 step %c1 { + %10 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %13[%14, %15, %16] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_7[%18, %19, %20] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %21[@in] = %17 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_7[%22, %23, %24] = %21 : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array[%25, %26, %27] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %45 = pod.read %21[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @Poly_19::@Poly_19::@compute(%45) : (!felt.type<"babybear">) -> !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + pod.write %28[@comp] = %46 : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + %47 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%47, %48, %49] = %28 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%32, %33, %34] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@comp] : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_4[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39, %40, %41] = %37 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %38 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %43 : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %45 = pod.read %pod_4[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %46 = function.call @SumPooling2D_5::@SumPooling2D_5::@compute(%45) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %46 : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c13 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c13 step %c1 { + %10 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %13[%14, %15, %16] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%19, %20, %21] = %17 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %18 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %23 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Conv2D_7::@Conv2D_7::@compute(%25, %26, %27) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %28 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c3 step %c1 { + %17 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %18 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg10 = %c0 to %c4 step %c1 { + %19 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg3[%20, %21, %22, %23] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%26, %27, %28, %29] = %24 : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@weights] = %25 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %36 = function.call @Conv2D_7::@Conv2D_7::@compute(%33, %34, %35) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %36 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg4[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@bias] = %12 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @Conv2D_7::@Conv2D_7::@compute(%17, %18, %19) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c11 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c11 step %c1 { + %10 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c8 step %c1 { + %11 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %13[%14, %15, %16] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_15[%18, %19, %20] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %21[@in] = %17 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_15[%22, %23, %24] = %21 : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_14[%25, %26, %27] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %45 = pod.read %21[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @Poly_20::@Poly_20::@compute(%45) : (!felt.type<"babybear">) -> !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + pod.write %28[@comp] = %46 : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + %47 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_14[%47, %48, %49] = %28 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_14[%32, %33, %34] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@comp] : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_13[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39, %40, %41] = %37 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_13[@in] = %38 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_12[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_12[@count] = %43 : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %45 = pod.read %pod_13[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %46 = function.call @SumPooling2D_8::@SumPooling2D_8::@compute(%45) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + pod.write %pod_12[@comp] = %46 : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg8 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg9 = %c0 to %c8 step %c1 { + %11 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %13[%14, %15, %16] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_9[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%19, %20, %21] = %17 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_9[@in] = %18 : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_8[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_8[@count] = %23 : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_9[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @Flatten2D_9::@Flatten2D_9::@compute(%25) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + pod.write %pod_8[@comp] = %26 : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %14 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Dense_13::@Dense_13::@compute(%19, %20, %21) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %22 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg8 = %c0 to %c10 step %c1 { + %19 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg5[%20, %21] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24, %25] = %22 : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@weights] = %23 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %27 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %29 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %32 = function.call @Dense_13::@Dense_13::@compute(%29, %30, %31) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %32 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg6[%10] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@bias] = %12 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %15 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_6[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_6[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_6[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @Dense_13::@Dense_13::@compute(%17, %18, %19) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %20 : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %9 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_11[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_11[@in] = %19 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_10[@count] : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_10[@count] = %22 : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %pod_11[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @ArgMax_18::@ArgMax_18::@compute(%24) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + pod.write %pod_10[@comp] = %25 : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_10[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_9 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %2 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "compute"} + struct.writem %self[@poly_2$inputs] = %array_15 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_16 = array.new : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c11 step %c1 { + scf.for %arg8 = %c0 to %c11 step %c1 { + scf.for %arg9 = %c0 to %c8 step %c1 { + %9 = array.read %array_14[%arg7, %arg8, %arg9] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@Poly_20::@Poly_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + array.write %array_16[%arg7, %arg8, %arg9] = %10 : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_2] = %array_16 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> {product_source = "compute"} + struct.writem %self[@sum2d_2$inputs] = %pod_13 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_12[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + struct.writem %self[@sum2d_2] = %3 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1$inputs] = %pod_2 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1] = %4 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_11 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_10[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_18::@ArgMax_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %5 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_6 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Dense_13::@Dense_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %6 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2$inputs] = %pod_0 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_7::@Conv2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2] = %7 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "compute"} + struct.writem %self[@sum2d_1$inputs] = %pod_4 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + struct.writem %self[@sum2d_1] = %8 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "compute"} + struct.writem %self[@poly_1$inputs] = %array_7 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_17 = array.new : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> {product_source = "compute"} + scf.for %arg7 = %c0 to %c26 step %c1 { + scf.for %arg8 = %c0 to %c26 step %c1 { + scf.for %arg9 = %c0 to %c4 step %c1 { + %9 = array.read %array[%arg7, %arg8, %arg9] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@Poly_19::@Poly_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + array.write %array_17[%arg7, %arg8, %arg9] = %10 : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_1] = %array_17 : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@mnist_convnet_21::@mnist_convnet_21<[]>> + } + function.def @constrain(%arg0: !struct.type<@mnist_convnet_21::@mnist_convnet_21<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg5: !array.type<8 x !felt.type<"babybear">>, %arg6: !array.type<200,10 x !felt.type<"babybear">>, %arg7: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant 10 : index + %c200 = arith.constant 200 : index + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c26 = arith.constant {product_source = "constrain"} 26 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c8 = arith.constant {product_source = "constrain"} 8 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %0 = struct.readm %arg0[@out] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@dense_out] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@conv2d_2] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_7::@Conv2D_7<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@conv2d_2$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@conv2d_1] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@conv2d_1$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@sum2d_1] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@sum2d_1$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %arg0[@dense] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Dense_13::@Dense_13<[]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@dense$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = struct.readm %arg0[@poly_1] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>> {product_source = "constrain"} + %11 = struct.readm %arg0[@poly_1$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@flatten] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@Flatten2D_9::@Flatten2D_9<[]>> {product_source = "constrain"} + %13 = struct.readm %arg0[@flatten$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = struct.readm %arg0[@argmax] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@ArgMax_18::@ArgMax_18<[]>> {product_source = "constrain"} + %15 = struct.readm %arg0[@argmax$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = struct.readm %arg0[@sum2d_2] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>> {product_source = "constrain"} + %17 = struct.readm %arg0[@sum2d_2$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = struct.readm %arg0[@poly_2] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>> {product_source = "constrain"} + %19 = struct.readm %arg0[@poly_2$inputs] : <@mnist_convnet_21::@mnist_convnet_21<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg8 = %c0 to %c28 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c28 step %c1 { + %35 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg1[%36, %37, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = pod.read %5[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %39[%40, %41, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c4 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %40 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c3 step %c1 { + %41 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg2[%42, %43, %c0, %44] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %5[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %46[%47, %48, %c0, %49] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg3[%35] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = pod.read %5[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %37[%38] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c26 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c26 step %c1 { + %35 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c4 step %c1 { + %36 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = struct.readm %4[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %37[%38, %39, %40] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %11[%42, %43, %44] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %10[%47, %48, %49] : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Poly_19::@Poly_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %7[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %52[%53, %54, %55] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c13 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c13 step %c1 { + %35 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c4 step %c1 { + %36 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = struct.readm %6[@out] : <@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %37[%38, %39, %40] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = pod.read %3[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %42[%43, %44, %45] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c8 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c3 step %c1 { + %40 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c3 step %c1 { + %41 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %42 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %arg4[%43, %44, %45, %46] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = pod.read %3[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %48[%49, %50, %51, %52] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg5[%35] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = pod.read %3[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %37[%38] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c11 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c11 step %c1 { + %35 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c8 step %c1 { + %36 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = struct.readm %2[@out] : <@Conv2D_7::@Conv2D_7<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %37[%38, %39, %40] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %19[%42, %43, %44] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %18[%47, %48, %49] : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@out] : <@Poly_20::@Poly_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %17[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %52[%53, %54, %55] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c5 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c5 step %c1 { + %35 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg10 = %c0 to %c8 step %c1 { + %36 = cast.tofelt %arg10 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = struct.readm %16[@out] : <@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %37[%38, %39, %40] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = pod.read %13[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %42[%43, %44, %45] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c200 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %35 = struct.readm %12[@out] : <@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %9[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %38[%39] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg9 = %c0 to %c10 step %c1 { + %41 = cast.tofelt %arg9 : index, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %arg6[%42, %43] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %9[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %45[%46, %47] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c10 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg7[%35] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = pod.read %9[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %37[%38] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg8 = %c0 to %c10 step %c1 { + %34 = cast.tofelt %arg8 : index, !felt.type<"babybear"> {product_source = "constrain"} + %35 = struct.readm %8[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %1[%38] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = struct.readm %8[@out] : <@Dense_13::@Dense_13<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %40[%41] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = pod.read %15[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %20 = struct.readm %14[@out] : <@ArgMax_18::@ArgMax_18<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %13[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_9::@Flatten2D_9::@constrain(%12, %21) : (!struct.type<@Flatten2D_9::@Flatten2D_9<[]>>, !array.type<5,5,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg8 = %c0 to %c11 step %c1 { + scf.for %arg9 = %c0 to %c11 step %c1 { + scf.for %arg10 = %c0 to %c8 step %c1 { + %34 = array.read %18[%arg8, %arg9, %arg10] : <11,11,8 x !struct.type<@Poly_20::@Poly_20<[]>>>, !struct.type<@Poly_20::@Poly_20<[]>> {product_source = "constrain"} + %35 = array.read %19[%arg8, %arg9, %arg10] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_20::@Poly_20::@constrain(%34, %36) : (!struct.type<@Poly_20::@Poly_20<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %22 = pod.read %17[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_8::@SumPooling2D_8::@constrain(%16, %22) : (!struct.type<@SumPooling2D_8::@SumPooling2D_8<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %23 = pod.read %5[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = pod.read %5[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = pod.read %5[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%4, %23, %24, %25) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %26 = pod.read %15[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_18::@ArgMax_18::@constrain(%14, %26) : (!struct.type<@ArgMax_18::@ArgMax_18<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %27 = pod.read %9[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = pod.read %9[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = pod.read %9[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_13::@Dense_13::@constrain(%8, %27, %28, %29) : (!struct.type<@Dense_13::@Dense_13<[]>>, !array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %30 = pod.read %3[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = pod.read %3[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = pod.read %3[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_7::@Conv2D_7::@constrain(%2, %30, %31, %32) : (!struct.type<@Conv2D_7::@Conv2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %33 = pod.read %7[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_5::@SumPooling2D_5::@constrain(%6, %33) : (!struct.type<@SumPooling2D_5::@SumPooling2D_5<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg8 = %c0 to %c26 step %c1 { + scf.for %arg9 = %c0 to %c26 step %c1 { + scf.for %arg10 = %c0 to %c4 step %c1 { + %34 = array.read %10[%arg8, %arg9, %arg10] : <26,26,4 x !struct.type<@Poly_19::@Poly_19<[]>>>, !struct.type<@Poly_19::@Poly_19<[]>> {product_source = "constrain"} + %35 = array.read %11[%arg8, %arg9, %arg10] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_19::@Poly_19::@constrain(%34, %36) : (!struct.type<@Poly_19::@Poly_19<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mnist_latest_precision_test.llzk b/examples/circom-demo/mnist_latest_precision_test.llzk new file mode 100644 index 0000000..0298696 --- /dev/null +++ b/examples/circom-demo/mnist_latest_precision_test.llzk @@ -0,0 +1,6942 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg0[%2, %3] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10] = %8 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = cast.toindex %2 : !felt.type<"babybear"> + %5 = array.read %arg1[%3, %4] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg2[%6, %7] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<9 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %nondet[%9] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %arg0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %arg4 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + %2 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %7 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = cast.toindex %8 : !felt.type<"babybear"> + %16 = array.read %arg1[%14, %15] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %arg5 : !felt.type<"babybear"> + %19 = array.read %1[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %10 : !felt.type<"babybear"> + } + scf.yield %7 : !felt.type<"babybear"> + } + %5 = array.read %1[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<1 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %self = struct.new : <@Sum_2::@Sum_2<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_3 { + struct.def @Conv2D_3 { + struct.member @out : !array.type<26,26,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c18 = arith.constant 18 : index + %c9 = arith.constant 9 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> + %nondet = llzk.nondet : !array.type<26,26,4 x !felt.type<"babybear">> + %array = array.new : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %c0, %arg5] = %0 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %c0, %arg5] = %0 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_2 = array.new : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %arg5] = %0 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_4 = array.new : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %5 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %8, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%7, %10, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + %15 = array.read %array_2[%12, %13, %c0, %14] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %17 = cast.toindex %3 : !felt.type<"babybear"> + %18 = cast.toindex %4 : !felt.type<"babybear"> + array.write %16[%17, %18] = %11 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %0 : !felt.type<"babybear"> + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = cast.toindex %2 : !felt.type<"babybear"> + %22 = array.read %array_2[%19, %20, %c0, %21] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %22[@a] = %16 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_2[%23, %24, %c0, %25] = %22 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %array_1[%26, %27, %c0, %28] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %58 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %59 = pod.read %22[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %60 = function.call @matElemMul_0::@matElemMul_0::@compute(%58, %59) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %29[@comp] = %60 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_1[%61, %62, %c0, %63] = %29 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %33 = cast.toindex %3 : !felt.type<"babybear"> + %34 = cast.toindex %4 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %arg1[%33, %34, %c0, %35] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = cast.toindex %2 : !felt.type<"babybear"> + %40 = array.read %array_2[%37, %38, %c0, %39] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %41 = pod.read %40[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %42 = cast.toindex %3 : !felt.type<"babybear"> + %43 = cast.toindex %4 : !felt.type<"babybear"> + array.write %41[%42, %43] = %36 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %0 : !felt.type<"babybear"> + %45 = cast.toindex %1 : !felt.type<"babybear"> + %46 = cast.toindex %2 : !felt.type<"babybear"> + %47 = array.read %array_2[%44, %45, %c0, %46] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %47[@b] = %41 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %48 = cast.toindex %0 : !felt.type<"babybear"> + %49 = cast.toindex %1 : !felt.type<"babybear"> + %50 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_2[%48, %49, %c0, %50] = %47 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + %53 = cast.toindex %2 : !felt.type<"babybear"> + %54 = array.read %array_1[%51, %52, %c0, %53] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %55 = pod.read %54[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %56 = arith.subi %55, %c1 : index + pod.write %54[@count] = %56 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %57 = arith.cmpi eq, %56, %c0 : index + scf.if %57 { + %58 = pod.read %47[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %59 = pod.read %47[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %60 = function.call @matElemMul_0::@matElemMul_0::@compute(%58, %59) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %54[@comp] = %60 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_1[%61, %62, %c0, %63] = %54 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %array_1[%5, %6, %c0, %7] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %10 = struct.readm %9[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = array.read %10[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = array.read %array_0[%14, %15, %c0, %16] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %19 = cast.toindex %3 : !felt.type<"babybear"> + %20 = cast.toindex %4 : !felt.type<"babybear"> + array.write %18[%19, %20] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = cast.toindex %2 : !felt.type<"babybear"> + %24 = array.read %array_0[%21, %22, %c0, %23] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %24[@a] = %18 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = cast.toindex %1 : !felt.type<"babybear"> + %27 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%25, %26, %c0, %27] = %24 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = cast.toindex %1 : !felt.type<"babybear"> + %30 = cast.toindex %2 : !felt.type<"babybear"> + %31 = array.read %array[%28, %29, %c0, %30] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %35 = pod.read %24[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %36 = function.call @matElemSum_1::@matElemSum_1::@compute(%35) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %31[@comp] = %36 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%37, %38, %c0, %39] = %31 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %15 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%15) + } do { + %15 = cast.toindex %0 : !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = cast.toindex %2 : !felt.type<"babybear"> + %18 = array.read %array[%15, %16, %c0, %17] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %20 = struct.readm %19[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = cast.toindex %2 : !felt.type<"babybear"> + %24 = array.read %array_4[%21, %22, %23] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %25 = pod.read %24[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + array.write %25[%c0] = %20 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %array_4[%26, %27, %28] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + pod.write %29[@in] = %25 : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %30 = cast.toindex %0 : !felt.type<"babybear"> + %31 = cast.toindex %1 : !felt.type<"babybear"> + %32 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_4[%30, %31, %32] = %29 : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %array_3[%33, %34, %35] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %29[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %41 = function.call @Sum_2::@Sum_2::@compute(%40) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + pod.write %36[@comp] = %41 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %42 = cast.toindex %0 : !felt.type<"babybear"> + %43 = cast.toindex %1 : !felt.type<"babybear"> + %44 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_3[%42, %43, %44] = %36 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array_3[%3, %4, %5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = struct.readm %7[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%12, %13, %14] = %11 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_5 = array.new : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_5[%arg3, %arg4, %c0, %arg5] = %1 : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@sum$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %array_6 = array.new : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + array.write %array_6[%arg3, %arg4, %arg5] = %1 : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + } + } + } + struct.writem %self[@sum] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.writem %self[@mul$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_7 = array.new : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_7[%arg3, %arg4, %c0, %arg5] = %1 : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + } + struct.writem %self[@mul] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + %6 = struct.readm %arg0[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c26 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c26 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %12 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%14, %17, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %7 : !felt.type<"babybear"> + %20 = cast.toindex %8 : !felt.type<"babybear"> + %21 = cast.toindex %9 : !felt.type<"babybear"> + %22 = array.read %4[%19, %20, %c0, %21] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %23 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %24 = cast.toindex %10 : !felt.type<"babybear"> + %25 = cast.toindex %11 : !felt.type<"babybear"> + %26 = array.read %23[%24, %25] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %10 : !felt.type<"babybear"> + %28 = cast.toindex %11 : !felt.type<"babybear"> + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = array.read %arg2[%27, %28, %c0, %29] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %7 : !felt.type<"babybear"> + %32 = cast.toindex %8 : !felt.type<"babybear"> + %33 = cast.toindex %9 : !felt.type<"babybear"> + %34 = array.read %4[%31, %32, %c0, %33] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %35 = pod.read %34[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %36 = cast.toindex %10 : !felt.type<"babybear"> + %37 = cast.toindex %11 : !felt.type<"babybear"> + %38 = array.read %35[%36, %37] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %12 = cast.toindex %7 : !felt.type<"babybear"> + %13 = cast.toindex %8 : !felt.type<"babybear"> + %14 = cast.toindex %9 : !felt.type<"babybear"> + %15 = array.read %3[%12, %13, %c0, %14] : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %16 = struct.readm %15[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %17 = cast.toindex %10 : !felt.type<"babybear"> + %18 = cast.toindex %11 : !felt.type<"babybear"> + %19 = array.read %16[%17, %18] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %7 : !felt.type<"babybear"> + %21 = cast.toindex %8 : !felt.type<"babybear"> + %22 = cast.toindex %9 : !felt.type<"babybear"> + %23 = array.read %2[%20, %21, %c0, %22] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %24 = pod.read %23[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %11 : !felt.type<"babybear"> + %27 = array.read %24[%25, %26] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %22 = bool.cmp lt(%arg7, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%22) + } do { + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = cast.toindex %9 : !felt.type<"babybear"> + %25 = array.read %1[%22, %23, %c0, %24] : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %26 = struct.readm %25[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %27 = cast.toindex %7 : !felt.type<"babybear"> + %28 = cast.toindex %8 : !felt.type<"babybear"> + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = array.read %6[%27, %28, %29] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %31 = pod.read %30[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %32 = array.read %31[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %10 = cast.toindex %7 : !felt.type<"babybear"> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %5[%10, %11, %12] : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %arg3[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %0[%18, %19, %20] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %1[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %2[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6] : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = array.read %6[%arg4, %arg5, %arg6] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %3[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %4[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @BatchNormalization2D_4 { + struct.def @BatchNormalization2D_4 { + struct.member @out : !array.type<26,26,4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> + %nondet = llzk.nondet : !array.type<26,26,4 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c26 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg0[%5, %6, %7] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %4, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%13, %14, %15] = %12 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@out] = %nondet : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c26 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg2[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg1[%6, %7, %8] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg3[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %0[%14, %15, %16] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + function.return + } + } + } + poly.template @matElemSum_5 { + struct.def @matElemSum_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sum] : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10:2 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %12 { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %23 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %13 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp gt(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %17 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg0[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %10#0, %10#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + %6 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_5::@matElemSum_5<[]>> + } + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %7 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_5::@matElemSum_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%14, %15] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %1[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %10 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7 : !felt.type<"babybear"> + } {product_source = "constrain"} + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @SumPooling2D_6 { + struct.def @SumPooling2D_6 { + struct.member @out : !array.type<13,13,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.member @elemSum$inputs : !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c13 = arith.constant {product_source = "compute"} 13 : index + %self = struct.new : <@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %24 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%32, %33, %34] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %29 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38] = %35 : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%39, %40, %41] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %35[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @matElemSum_5::@matElemSum_5::@product(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %48 = function.call @matElemSum_5::@matElemSum_5::@compute(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + pod.write %42[@comp] = %47 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %42 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c13 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_5::@matElemSum_5::@constrain(%3, %5) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + } + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c13 = arith.constant {product_source = "compute"} 13 : index + %self = struct.new : <@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%29, %30, %31] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %34, %35] = %32 : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%36, %37, %38] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @matElemSum_5::@matElemSum_5::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%45, %46, %47] = %39 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c13 = arith.constant {product_source = "constrain"} 13 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_5::@matElemSum_5::@constrain(%3, %5) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AveragePooling2D_7 { + struct.def @AveragePooling2D_7 { + struct.member @out : !array.type<13,13,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @sumPooling2D : !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + struct.member @sumPooling2D$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c13 = arith.constant 13 : index + %c4 = arith.constant 4 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "compute"} + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %self = struct.new : <@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c26 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13, %14, %15] = %11 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %12 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @SumPooling2D_6::@SumPooling2D_6::@product(%19) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + %21 = function.call @SumPooling2D_6::@SumPooling2D_6::@compute(%19) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %9[%10, %11, %12] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %13, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15, %16, %17] = %14 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@sumPooling2D] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@sumPooling2D$inputs] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c26 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%8, %9, %10] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %3[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %12[%13, %14, %15] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c13 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %2[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %8[%9, %10, %11] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %12, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%14, %15, %16] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = pod.read %3[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_6::@SumPooling2D_6::@constrain(%2, %4) : (!struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> + } + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c13 = arith.constant 13 : index + %c4 = arith.constant 4 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "compute"} + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %self = struct.new : <@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c26 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%4, %5, %6] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9, %10, %11] = %7 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %8 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = function.call @SumPooling2D_6::@SumPooling2D_6::@compute(%15) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c13 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %5[%6, %7, %8] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %9, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12, %13] = %10 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c13 = arith.constant 13 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@sumPooling2D] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sumPooling2D$inputs] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c26 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c26 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c4 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %11[%12, %13, %14] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c13 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c4 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %7[%8, %9, %10] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %11, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%13, %14, %15] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_6::@SumPooling2D_6::@constrain(%1, %3) : (!struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sum_8 { + struct.def @Sum_8 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<4 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Sum_8::@Sum_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Sum_8::@Sum_8<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c1 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %2 : !felt.type<"babybear"> + %7 = array.read %arg0[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %1 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_8::@Sum_8<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_8::@Sum_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_8::@Sum_8<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_8::@Sum_8<[]>>, !array.type<4 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = array.read %1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_9 { + struct.def @Conv2D_9 { + struct.member @out : !array.type<11,11,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @mul : !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + struct.member @sum$inputs : !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + struct.member @elemSum : !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<13,13,4 x !felt.type<"babybear">>, %arg1: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %c9 = arith.constant 9 : index + %c18 = arith.constant 18 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c4 = arith.constant 4 : index + %c11 = arith.constant 11 : index + %self = struct.new : <@Conv2D_9::@Conv2D_9<[]>> + %nondet = llzk.nondet : !array.type<11,11,8 x !felt.type<"babybear">> + %array = array.new : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %arg5, %arg6] = %0 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_0 = array.new : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c8 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %arg5] = %0 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_2 = array.new : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %array_3 = array.new : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %arg5, %arg6] = %0 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_4 = array.new : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %6 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = array.read %arg0[%8, %11, %12] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = cast.toindex %3 : !felt.type<"babybear"> + %18 = array.read %array_0[%14, %15, %16, %17] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %20 = cast.toindex %4 : !felt.type<"babybear"> + %21 = cast.toindex %5 : !felt.type<"babybear"> + array.write %19[%20, %21] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = array.read %array_0[%22, %23, %24, %25] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %26[@a] = %19 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %27 = cast.toindex %0 : !felt.type<"babybear"> + %28 = cast.toindex %1 : !felt.type<"babybear"> + %29 = cast.toindex %2 : !felt.type<"babybear"> + %30 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_0[%27, %28, %29, %30] = %26 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %31 = cast.toindex %0 : !felt.type<"babybear"> + %32 = cast.toindex %1 : !felt.type<"babybear"> + %33 = cast.toindex %2 : !felt.type<"babybear"> + %34 = cast.toindex %3 : !felt.type<"babybear"> + %35 = array.read %array[%31, %32, %33, %34] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.subi %36, %c1 : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.cmpi eq, %37, %c0 : index + scf.if %38 { + %69 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %70 = pod.read %26[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %35[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %72 = cast.toindex %0 : !felt.type<"babybear"> + %73 = cast.toindex %1 : !felt.type<"babybear"> + %74 = cast.toindex %2 : !felt.type<"babybear"> + %75 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array[%72, %73, %74, %75] = %35 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %39 = cast.toindex %4 : !felt.type<"babybear"> + %40 = cast.toindex %5 : !felt.type<"babybear"> + %41 = cast.toindex %2 : !felt.type<"babybear"> + %42 = cast.toindex %3 : !felt.type<"babybear"> + %43 = array.read %arg1[%39, %40, %41, %42] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %0 : !felt.type<"babybear"> + %45 = cast.toindex %1 : !felt.type<"babybear"> + %46 = cast.toindex %2 : !felt.type<"babybear"> + %47 = cast.toindex %3 : !felt.type<"babybear"> + %48 = array.read %array_0[%44, %45, %46, %47] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %49 = pod.read %48[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %50 = cast.toindex %4 : !felt.type<"babybear"> + %51 = cast.toindex %5 : !felt.type<"babybear"> + array.write %49[%50, %51] = %43 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = cast.toindex %0 : !felt.type<"babybear"> + %53 = cast.toindex %1 : !felt.type<"babybear"> + %54 = cast.toindex %2 : !felt.type<"babybear"> + %55 = cast.toindex %3 : !felt.type<"babybear"> + %56 = array.read %array_0[%52, %53, %54, %55] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %56[@b] = %49 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %57 = cast.toindex %0 : !felt.type<"babybear"> + %58 = cast.toindex %1 : !felt.type<"babybear"> + %59 = cast.toindex %2 : !felt.type<"babybear"> + %60 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_0[%57, %58, %59, %60] = %56 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + %64 = cast.toindex %3 : !felt.type<"babybear"> + %65 = array.read %array[%61, %62, %63, %64] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %66 = pod.read %65[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %67 = arith.subi %66, %c1 : index + pod.write %65[@count] = %67 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %68 = arith.cmpi eq, %67, %c0 : index + scf.if %68 { + %69 = pod.read %56[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %70 = pod.read %56[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %65[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %72 = cast.toindex %0 : !felt.type<"babybear"> + %73 = cast.toindex %1 : !felt.type<"babybear"> + %74 = cast.toindex %2 : !felt.type<"babybear"> + %75 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array[%72, %73, %74, %75] = %65 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %array[%6, %7, %8, %9] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = array.read %12[%13, %14] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = cast.toindex %2 : !felt.type<"babybear"> + %19 = cast.toindex %3 : !felt.type<"babybear"> + %20 = array.read %array_4[%16, %17, %18, %19] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %22 = cast.toindex %4 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + array.write %21[%22, %23] = %15 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %0 : !felt.type<"babybear"> + %25 = cast.toindex %1 : !felt.type<"babybear"> + %26 = cast.toindex %2 : !felt.type<"babybear"> + %27 = cast.toindex %3 : !felt.type<"babybear"> + %28 = array.read %array_4[%24, %25, %26, %27] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %28[@a] = %21 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_4[%29, %30, %31, %32] = %28 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = cast.toindex %3 : !felt.type<"babybear"> + %37 = array.read %array_3[%33, %34, %35, %36] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %41 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %42 = function.call @matElemSum_1::@matElemSum_1::@compute(%41) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %37[@comp] = %42 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + %44 = cast.toindex %1 : !felt.type<"babybear"> + %45 = cast.toindex %2 : !felt.type<"babybear"> + %46 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_3[%43, %44, %45, %46] = %37 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + } + scf.for %arg5 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %15 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = cast.toindex %2 : !felt.type<"babybear"> + %20 = array.read %array_3[%16, %17, %18, %19] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %22 = struct.readm %21[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + %26 = array.read %array_2[%23, %24, %25] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %28 = cast.toindex %15 : !felt.type<"babybear"> + array.write %27[%28] = %22 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_2[%29, %30, %31] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + pod.write %32[@in] = %27 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_2[%33, %34, %35] = %32 : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array_1[%36, %37, %38] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %44 = function.call @Sum_8::@Sum_8::@compute(%43) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Sum_8::@Sum_8<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_8::@Sum_8<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_1[%45, %46, %47] = %39 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array_1[%3, %4, %5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_8::@Sum_8<[]>> + %8 = struct.readm %7[@out] : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%12, %13, %14] = %11 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_4 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_5 = array.new : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %1 : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + } + } + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@mul$inputs] = %array_0 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_6 = array.new : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_6[%arg3, %arg4, %arg5, %arg6] = %1 : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + } + } + struct.writem %self[@mul] = %array_6 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@sum$inputs] = %array_2 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %array_7 = array.new : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c8 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_8::@Sum_8<[]>> + array.write %array_7[%arg3, %arg4, %arg5] = %1 : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>>, !struct.type<@Sum_8::@Sum_8<[]>> + } + } + } + struct.writem %self[@sum] = %array_7 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_9::@Conv2D_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, %arg1: !array.type<13,13,4 x !felt.type<"babybear">>, %arg2: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg3: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c4 = arith.constant 4 : index + %c11 = arith.constant 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@mul] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %2 = struct.readm %arg0[@mul$inputs] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@sum] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + %4 = struct.readm %arg0[@sum$inputs] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@elemSum] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %6 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c11 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c11 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c8 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %13 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = cast.toindex %9 : !felt.type<"babybear"> + %20 = array.read %arg1[%15, %18, %19] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %7 : !felt.type<"babybear"> + %22 = cast.toindex %8 : !felt.type<"babybear"> + %23 = cast.toindex %9 : !felt.type<"babybear"> + %24 = cast.toindex %10 : !felt.type<"babybear"> + %25 = array.read %2[%21, %22, %23, %24] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %27 = cast.toindex %11 : !felt.type<"babybear"> + %28 = cast.toindex %12 : !felt.type<"babybear"> + %29 = array.read %26[%27, %28] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %11 : !felt.type<"babybear"> + %31 = cast.toindex %12 : !felt.type<"babybear"> + %32 = cast.toindex %9 : !felt.type<"babybear"> + %33 = cast.toindex %10 : !felt.type<"babybear"> + %34 = array.read %arg2[%30, %31, %32, %33] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = cast.toindex %7 : !felt.type<"babybear"> + %36 = cast.toindex %8 : !felt.type<"babybear"> + %37 = cast.toindex %9 : !felt.type<"babybear"> + %38 = cast.toindex %10 : !felt.type<"babybear"> + %39 = array.read %2[%35, %36, %37, %38] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %40 = pod.read %39[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %41 = cast.toindex %11 : !felt.type<"babybear"> + %42 = cast.toindex %12 : !felt.type<"babybear"> + %43 = array.read %40[%41, %42] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = cast.toindex %8 : !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = cast.toindex %10 : !felt.type<"babybear"> + %17 = array.read %1[%13, %14, %15, %16] : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = cast.toindex %12 : !felt.type<"babybear"> + %21 = array.read %18[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = cast.toindex %9 : !felt.type<"babybear"> + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = array.read %6[%22, %23, %24, %25] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %27 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %28 = cast.toindex %11 : !felt.type<"babybear"> + %29 = cast.toindex %12 : !felt.type<"babybear"> + %30 = array.read %27[%28, %29] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + } + scf.for %arg6 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %23 = cast.toindex %7 : !felt.type<"babybear"> + %24 = cast.toindex %8 : !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = cast.toindex %9 : !felt.type<"babybear"> + %27 = array.read %5[%23, %24, %25, %26] : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %29 = cast.toindex %7 : !felt.type<"babybear"> + %30 = cast.toindex %8 : !felt.type<"babybear"> + %31 = cast.toindex %9 : !felt.type<"babybear"> + %32 = array.read %4[%29, %30, %31] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %33 = pod.read %32[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %34 = cast.toindex %22 : !felt.type<"babybear"> + %35 = array.read %33[%34] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = cast.toindex %7 : !felt.type<"babybear"> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %3[%10, %11, %12] : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>>, !struct.type<@Sum_8::@Sum_8<[]>> + %14 = struct.readm %13[@out] : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %arg3[%15] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %0[%18, %19, %20] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + scf.for %arg7 = %c0 to %c8 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %6[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + scf.for %arg7 = %c0 to %c8 step %c1 { + %7 = array.read %1[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %2[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %7 = array.read %3[%arg4, %arg5, %arg6] : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>>, !struct.type<@Sum_8::@Sum_8<[]>> + %8 = array.read %4[%arg4, %arg5, %arg6] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + function.call @Sum_8::@Sum_8::@constrain(%7, %9) : (!struct.type<@Sum_8::@Sum_8<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @BatchNormalization2D_10 { + struct.def @BatchNormalization2D_10 { + struct.member @out : !array.type<11,11,8 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> + %nondet = llzk.nondet : !array.type<11,11,8 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c11 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg0[%5, %6, %7] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %4, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%13, %14, %15] = %12 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@out] = %nondet : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>, %arg3: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c11 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg2[%4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg1[%6, %7, %8] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg3[%11] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %0[%14, %15, %16] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + function.return + } + } + } + poly.template @SumPooling2D_11 { + struct.def @SumPooling2D_11 { + struct.member @out : !array.type<5,5,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.member @elemSum$inputs : !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %3 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%19, %22, %23] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%25, %26, %27] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30, %31] = %24 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%32, %33, %34] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@a] = %29 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%36, %37, %38] = %35 : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%39, %40, %41] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %35[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @matElemSum_5::@matElemSum_5::@product(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %48 = function.call @matElemSum_5::@matElemSum_5::@compute(%46) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + pod.write %42[@comp] = %47 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %42 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%6, %7, %8] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12, %13, %14] = %11 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %4 : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@elemSum] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@elemSum$inputs] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%19, %22, %23] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = array.read %1[%arg1, %arg2, %arg3] : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_5::@matElemSum_5::@constrain(%3, %5) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + } + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1, %arg2, %arg3] = %0 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%16, %19, %20] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%22, %23, %24] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%29, %30, %31] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %34, %35] = %32 : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%36, %37, %38] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @matElemSum_5::@matElemSum_5::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%45, %46, %47] = %39 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%3, %4, %5] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10, %11] = %8 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c8 = arith.constant {product_source = "constrain"} 8 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%19, %22, %23] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%25, %26, %27] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%6, %7, %8] : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %10 = struct.readm %9[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%11, %12, %13] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c5 step %c1 { + scf.for %arg4 = %c0 to %c8 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3, %arg4] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_5::@matElemSum_5::@constrain(%3, %5) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AveragePooling2D_12 { + struct.def @AveragePooling2D_12 { + struct.member @out : !array.type<5,5,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @sumPooling2D : !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + struct.member @sumPooling2D$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c8 = arith.constant 8 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "compute"} + %c968 = arith.constant {product_source = "compute"} 968 : index + %self = struct.new : <@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%8, %9, %10] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13, %14, %15] = %11 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %12 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @SumPooling2D_11::@SumPooling2D_11::@product(%19) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + %21 = function.call @SumPooling2D_11::@SumPooling2D_11::@compute(%19) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %9[%10, %11, %12] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %13, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15, %16, %17] = %14 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@sumPooling2D] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@sumPooling2D$inputs] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%8, %9, %10] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %3[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %12[%13, %14, %15] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %2[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %8[%9, %10, %11] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %12, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%14, %15, %16] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %4 = pod.read %3[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_11::@SumPooling2D_11::@constrain(%2, %4) : (!struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> + } + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c8 = arith.constant 8 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "compute"} + %c968 = arith.constant {product_source = "compute"} 968 : index + %self = struct.new : <@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%4, %5, %6] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9, %10, %11] = %7 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %8 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = function.call @SumPooling2D_11::@SumPooling2D_11::@compute(%15) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %5[%6, %7, %8] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %9, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12, %13] = %10 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant 5 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@sumPooling2D] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@sumPooling2D$inputs] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c11 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c8 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %11[%12, %13, %14] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c8 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %7[%8, %9, %10] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %11, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%13, %14, %15] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @SumPooling2D_11::@SumPooling2D_11::@constrain(%1, %3) : (!struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Flatten2D_13 { + struct.def @Flatten2D_13 { + struct.member @out : !array.type<200 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Flatten2D_13::@Flatten2D_13<[]>> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + %0 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = scf.for %arg3 = %c0 to %c5 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = scf.for %arg5 = %c0 to %c8 step %c1 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg0[%6, %7, %8] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %11 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + scf.yield %2 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> + function.return %self : !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, %arg1: !array.type<5,5,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> + %1 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %5 = scf.for %arg6 = %c0 to %c8 step %c1 iter_args(%arg7 = %arg5) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %4 : !felt.type<"babybear"> + %9 = cast.toindex %6 : !felt.type<"babybear"> + %10 = array.read %arg1[%7, %8, %9] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %arg7 : !felt.type<"babybear"> + %12 = array.read %0[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13 : !felt.type<"babybear"> + } + scf.yield %5 : !felt.type<"babybear"> + } + scf.yield %3 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemMul_14 { + struct.def @matElemMul_14 { + struct.member @out : !array.type<1,200 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>, %arg1: !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_14::@matElemMul_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_14::@matElemMul_14<[]>> + %nondet = llzk.nondet : !array.type<1,200 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c200 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_14::@matElemMul_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>, %arg2: !array.type<1,200 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c200 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_15 { + struct.def @matElemSum_15 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<200 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_15::@matElemSum_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c199 = arith.constant 199 : index + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_15::@matElemSum_15<[]>> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c200 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c199] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_15::@matElemSum_15<[]>>, !array.type<200 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_15::@matElemSum_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_15::@matElemSum_15<[]>>, !array.type<200 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c200 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c199] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_16 { + struct.def @matMul_16 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>, %arg1: !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_16::@matMul_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c200 = arith.constant 200 : index + %c400 = arith.constant 400 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_16::@matMul_16<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c400 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c200 : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %16 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %32 = function.call @matElemMul_14::@matElemMul_14::@compute(%30, %31) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_14::@matElemMul_14<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + array.write %array[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %26 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %32 = function.call @matElemMul_14::@matElemMul_14::@compute(%30, %31) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_14::@matElemMul_14<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + array.write %array[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %19 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %24 = function.call @matElemSum_15::@matElemSum_15::@compute(%23) : (!array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_15::@matElemSum_15<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + array.write %array_1[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemMulComp$inputs] = %array_0 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + %2 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + struct.writem %self[@matElemMulComp] = %array_3 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + struct.writem %self[@matElemSumComp$inputs] = %array_2 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + %4 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + struct.writem %self[@matElemSumComp] = %array_4 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_16::@matMul_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_16::@matMul_16<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>, %arg2: !array.type<200,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemMulComp] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + %2 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemSumComp] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + %4 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c200 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c200 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + %6 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + function.call @matElemMul_14::@matElemMul_14::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> () + %9 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + %10 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %11 = pod.read %10[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + function.call @matElemSum_15::@matElemSum_15::@constrain(%9, %11) : (!struct.type<@matElemSum_15::@matElemSum_15<[]>>, !array.type<1,200 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_17 { + struct.def @Dense_17 { + struct.member @out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<10 x !struct.type<@matMul_16::@matMul_16<[]>>> + struct.member @dot$inputs : !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<200 x !felt.type<"babybear">>, %arg1: !array.type<200,10 x !felt.type<"babybear">>, %arg2: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c200 = arith.constant 200 : index + %c400 = arith.constant 400 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %self = struct.new : <@Dense_17::@Dense_17<[]>> + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + %array = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c400 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3] = %0 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c200 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %arg0[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %15 = pod.read %14[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %16 = cast.toindex %10 : !felt.type<"babybear"> + array.write %15[%c0, %16] = %12 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %array_0[%17] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + pod.write %18[@a] = %15 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %19 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%19] = %18 : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = array.read %array[%20] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %40 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %41 = pod.read %18[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %42 = function.call @matMul_16::@matMul_16::@compute(%40, %41) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_16::@matMul_16<[]>> + pod.write %21[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %21 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + } + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = array.read %arg1[%25, %26] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %30 = pod.read %29[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %31 = cast.toindex %10 : !felt.type<"babybear"> + array.write %30[%31, %c0] = %27 : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + %33 = array.read %array_0[%32] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + pod.write %33[@b] = %30 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %34 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%34] = %33 : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %35 = cast.toindex %0 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %41 = pod.read %33[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %42 = function.call @matMul_16::@matMul_16::@compute(%40, %41) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_16::@matMul_16<[]>> + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %36 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + } + } + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + %4 = struct.readm %3[@out] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %5 = array.read %4[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %arg2[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <10 x !struct.type<@matMul_16::@matMul_16<[]>>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + array.write %array_1[%arg3] = %1 : <10 x !struct.type<@matMul_16::@matMul_16<[]>>>, !struct.type<@matMul_16::@matMul_16<[]>> + } + struct.writem %self[@dot] = %array_1 : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !struct.type<@matMul_16::@matMul_16<[]>>> + struct.writem %self[@out] = %nondet : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> + function.return %self : !struct.type<@Dense_17::@Dense_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_17::@Dense_17<[]>>, %arg1: !array.type<200 x !felt.type<"babybear">>, %arg2: !array.type<200,10 x !felt.type<"babybear">>, %arg3: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c200 = arith.constant 200 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %0 = struct.readm %arg0[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@dot] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !struct.type<@matMul_16::@matMul_16<[]>>> + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c200 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = array.read %arg1[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %19 = cast.toindex %13 : !felt.type<"babybear"> + %20 = array.read %18[%c0, %19] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %13 : !felt.type<"babybear"> + %22 = cast.toindex %3 : !felt.type<"babybear"> + %23 = array.read %arg2[%21, %22] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %3 : !felt.type<"babybear"> + %25 = array.read %2[%24] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %26 = pod.read %25[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %27 = cast.toindex %13 : !felt.type<"babybear"> + %28 = array.read %26[%27, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <10 x !struct.type<@matMul_16::@matMul_16<[]>>>, !struct.type<@matMul_16::@matMul_16<[]>> + %6 = struct.readm %5[@out] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg3[%8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %0[%11] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = array.read %1[%arg4] : <10 x !struct.type<@matMul_16::@matMul_16<[]>>>, !struct.type<@matMul_16::@matMul_16<[]>> + %4 = array.read %2[%arg4] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + function.call @matMul_16::@matMul_16::@constrain(%3, %5, %6) : (!struct.type<@matMul_16::@matMul_16<[]>>, !array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @Num2Bits_18 { + struct.def @Num2Bits_18 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_19 { + struct.def @LessThan_19 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_18::@Num2Bits_18::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + %26 = function.call @Num2Bits_18::@Num2Bits_18::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_18::@Num2Bits_18::@constrain(%13, %23) : (!struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_19::@LessThan_19<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_18::@Num2Bits_18::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_19::@LessThan_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_19::@LessThan_19<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_18::@Num2Bits_18::@constrain(%1, %11) : (!struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_20 { + struct.def @GreaterThan_20 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_19::@LessThan_19<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_19::@LessThan_19::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> + %26 = function.call @LessThan_19::@LessThan_19::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_19::@LessThan_19::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_19::@LessThan_19::@constrain(%14, %23) : (!struct.type<@LessThan_19::@LessThan_19<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_19::@LessThan_19::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_19::@LessThan_19::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_19::@LessThan_19::@constrain(%1, %10) : (!struct.type<@LessThan_19::@LessThan_19<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_21 { + struct.def @Switcher_21 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_21::@Switcher_21<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_21::@Switcher_21<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_21::@Switcher_21<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ArgMax_22 { + struct.def @ArgMax_22 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<11 x !felt.type<"babybear">> + struct.member @amaxs : !array.type<11 x !felt.type<"babybear">> + struct.member @gts : !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> + struct.member @gts$inputs : !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @switchers : !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> + struct.member @switchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @aswitchers : !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> + struct.member @aswitchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %self = struct.new : <@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %15 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_2[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet_0[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_1[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c1] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_1[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %136 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_20::@GreaterThan_20::@product(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> + %138 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %25[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %139 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%139] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg0[%29] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_1[%31] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c0] = %30 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_1[%34] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@in] = %33 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%36] = %35 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array[%37] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %136 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %38[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %138 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%138] = %38 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array[%42] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_3[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@sel] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_2[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %136 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %53[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%141] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %nondet_0[%57] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_3[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@L] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_2[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %136 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %66[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%141] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %arg0[%70] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_3[%73] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %74[@R] = %71 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%76] = %74 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %77 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + %79 = array.read %array_2[%78] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %81 = arith.subi %80, %c1 {product_source = "compute"} : index + pod.write %79[@count] = %81 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %82 = arith.cmpi eq, %81, %c0 {product_source = "compute"} : index + scf.if %82 { + %136 = pod.read %74[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %74[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %74[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %79[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%141] = %79 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %83 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array[%83] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_5[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@sel] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_4[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %136 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %94[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %nondet[%98] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_5[%101] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %102[@L] = %99 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %103 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%104] = %102 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %105 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + %107 = array.read %array_4[%106] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %108 = pod.read %107[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %109 = arith.subi %108, %c1 {product_source = "compute"} : index + pod.write %107[@count] = %109 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %110 = arith.cmpi eq, %109, %c0 {product_source = "compute"} : index + scf.if %110 { + %136 = pod.read %102[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %102[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %102[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %107[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %107 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %111 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + %113 = array.read %array_5[%112] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %113[@R] = %15 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%115] = %113 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %116 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array_4[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %120 = arith.subi %119, %c1 {product_source = "compute"} : index + pod.write %118[@count] = %120 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %121 = arith.cmpi eq, %120, %c0 {product_source = "compute"} : index + scf.if %121 { + %136 = pod.read %113[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %113[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %113[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %118[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %118 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %122 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %122 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %array_4[%123] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %125 = pod.read %124[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %126 = struct.readm %125[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %127 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%128] = %126 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %129 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "compute"} + %131 = array.read %array_2[%130] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %132 = pod.read %131[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %133 = struct.readm %132[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %134 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %135 = cast.toindex %134 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%135] = %133 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_3 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_2[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %16 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_1 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %16 : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_7 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_5 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %16 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_8 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet_0 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@amaxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@gts] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@gts$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %7 = struct.readm %self[@switchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %8 = struct.readm %self[@switchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = struct.readm %self[@aswitchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %10 = struct.readm %self[@aswitchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %11 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %3[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %4[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %3[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %6[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg0[%22] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%24] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %26[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %5[%28] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %8[%32] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %3[%35] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %8[%38] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %arg0[%41] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %8[%44] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %5[%47] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %49 = struct.readm %48[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %10[%51] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %4[%54] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %10[%57] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %59 = pod.read %58[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %10[%61] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %63 = pod.read %62[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %9[%65] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %67 = struct.readm %66[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %4[%69] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %70, %67 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %7[%72] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %74 = struct.readm %73[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %3[%76] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = array.read %4[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %7[%arg1] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %16 = array.read %8[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %5[%arg1] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %16 = array.read %6[%arg1] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_20::@GreaterThan_20::@constrain(%15, %17) : (!struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %9[%arg1] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %16 = array.read %10[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@ArgMax_22::@ArgMax_22<[]>> + } + function.def @compute(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %self = struct.new : <@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_2[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet_0[%3] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_1[%5] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_1[%8] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%10] = %9 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%11] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %123 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %12[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%125] = %12 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_1[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_1[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %123 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %25[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%125] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array[%29] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%34] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%37] = %35 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_2[%39] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %123 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %40[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%128] = %40 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet_0[%44] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_3[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_2[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %123 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %53[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%128] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_3[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_2[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %123 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %66[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%128] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array[%70] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %72 = pod.read %71[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_5[%75] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %76[@sel] = %73 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%78] = %76 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %79 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_4[%80] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %81[@count] = %83 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %123 = pod.read %76[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %76[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %76[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %81[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %81 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %85 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %nondet[%85] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_5[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@L] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_4[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %123 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %94[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %array_5[%99] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %100[@R] = %2 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%102] = %100 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %103 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array_4[%104] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %123 = pod.read %100[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %100[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %100[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %105[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %105 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %109 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %109 : !felt.type<"babybear"> {product_source = "compute"} + %111 = array.read %array_4[%110] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %112 = pod.read %111[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %113 = struct.readm %112[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%115] = %113 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %116 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array_2[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %120 = struct.readm %119[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %121 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %121 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%122] = %120 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_3 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_2[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %3 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_1 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %3 : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_7 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_5 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %3 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_8 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet_0 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ArgMax_22::@ArgMax_22<[]>> + } + function.def @constrain(%arg0: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, %arg1: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant {product_source = "constrain"} 10 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@amaxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@gts] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@gts$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@switchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@switchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@aswitchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@aswitchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = array.read %arg1[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %2[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %1[%14] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %4[%16] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%20] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %4[%22] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %3[%26] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %6[%30] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %1[%33] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %6[%36] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg1[%39] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %6[%42] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %3[%45] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %8[%49] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %2[%52] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %8[%55] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %8[%59] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %61 = pod.read %60[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %7[%63] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %65 = struct.readm %64[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %2[%67] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %5[%70] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %1[%74] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %75, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %2[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %5[%arg2] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %14 = array.read %6[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = array.read %3[%arg2] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %14 = array.read %4[%arg2] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_20::@GreaterThan_20::@constrain(%13, %15) : (!struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %7[%arg2] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %14 = array.read %8[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_23 { + struct.def @Num2Bits_23 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_23::@Num2Bits_23<[]>> + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_23::@Num2Bits_23<[]>>, !array.type<254 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_23::@Num2Bits_23<[]>>, !array.type<254 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Num2Bits_24 { + struct.def @Num2Bits_24 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_24::@Num2Bits_24<[]>> + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_24::@Num2Bits_24<[]>>, !array.type<135 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_24::@Num2Bits_24<[]>>, !array.type<135 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @CompConstant_25 { + struct.def @CompConstant_25 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_25::@CompConstant_25<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@CompConstant_25::@CompConstant_25<[]>> + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.and %23, %24 : i1, i1 + scf.if %25 { + %32 = felt.neg %arg4 : !felt.type<"babybear"> + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg4, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = bool.and %32, %33 : i1, i1 + scf.if %34 { + %35 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg3, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = bool.and %35, %true : i1, i1 + scf.if %36 { + %37 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.add %40, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %37 = felt.neg %arg3 : !felt.type<"babybear"> + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %39, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + %26 = cast.toindex %8 : !felt.type<"babybear"> + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %arg2, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = felt.sub %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = felt.add %arg3, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %28, %30, %29, %31 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@sout] = %0#0 : <@CompConstant_25::@CompConstant_25<[]>>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @Num2Bits_24::@Num2Bits_24::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_24::@Num2Bits_24<[]>>, !array.type<135 x !felt.type<"babybear">> + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %6 : <@CompConstant_25::@CompConstant_25<[]>>, !felt.type<"babybear"> + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_25::@CompConstant_25<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + struct.writem %self[@num2bits] = %7 : <@CompConstant_25::@CompConstant_25<[]>>, !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + struct.writem %self[@parts] = %nondet : <@CompConstant_25::@CompConstant_25<[]>>, !array.type<127 x !felt.type<"babybear">> + function.return %self : !struct.type<@CompConstant_25::@CompConstant_25<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@CompConstant_25::@CompConstant_25<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@parts] : <@CompConstant_25::@CompConstant_25<[]>>, !array.type<127 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@sout] : <@CompConstant_25::@CompConstant_25<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_25::@CompConstant_25<[]>>, !struct.type<@Num2Bits_24::@Num2Bits_24<[]>> + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_25::@CompConstant_25<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_340282366920938463463374607431768211455, %arg6 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = bool.and %25, %26 : i1, i1 + scf.if %27 { + %34 = felt.neg %arg5 : !felt.type<"babybear"> + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %10 : !felt.type<"babybear"> + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = bool.and %34, %35 : i1, i1 + scf.if %36 { + %37 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = felt.add %44, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = cast.toindex %10 : !felt.type<"babybear"> + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = bool.and %37, %true : i1, i1 + scf.if %38 { + %39 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %10 : !felt.type<"babybear"> + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %39 = felt.neg %arg4 : !felt.type<"babybear"> + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %41, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %10 : !felt.type<"babybear"> + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + %28 = cast.toindex %10 : !felt.type<"babybear"> + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.add %arg3, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.sub %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.add %arg4, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = felt.mul %arg6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %30, %32, %31, %33 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %2, %5#0 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %3[@out] : <@Num2Bits_24::@Num2Bits_24<[]>>, !array.type<135 x !felt.type<"babybear">> + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_24::@Num2Bits_24::@constrain(%3, %9) : (!struct.type<@Num2Bits_24::@Num2Bits_24<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Sign_26 { + struct.def @Sign_26 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_25::@CompConstant_25<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_26::@Sign_26<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %self = struct.new : <@Sign_26::@Sign_26<[]>> + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %12 = function.call @CompConstant_25::@CompConstant_25::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_25::@CompConstant_25<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_25::@CompConstant_25<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_25::@CompConstant_25<[]>> + %1 = struct.readm %0[@out] : <@CompConstant_25::@CompConstant_25<[]>>, !felt.type<"babybear"> + struct.writem %self[@sign] = %1 : <@Sign_26::@Sign_26<[]>>, !felt.type<"babybear"> + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_26::@Sign_26<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_25::@CompConstant_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_25::@CompConstant_25<[]>> + struct.writem %self[@comp] = %2 : <@Sign_26::@Sign_26<[]>>, !struct.type<@CompConstant_25::@CompConstant_25<[]>> + function.return %self : !struct.type<@Sign_26::@Sign_26<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_26::@Sign_26<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_26::@Sign_26<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@comp] : <@Sign_26::@Sign_26<[]>>, !struct.type<@CompConstant_25::@CompConstant_25<[]>> + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_26::@Sign_26<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@CompConstant_25::@CompConstant_25<[]>>, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + function.call @CompConstant_25::@CompConstant_25::@constrain(%1, %4) : (!struct.type<@CompConstant_25::@CompConstant_25<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @IsPositive_27 { + struct.def @IsPositive_27 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sign : !struct.type<@Sign_26::@Sign_26<[]>> + struct.member @sign$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @num2Bits : !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + struct.member @num2Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_27::@IsPositive_27<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %self = struct.new : <@IsPositive_27::@IsPositive_27<[]>> + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_26::@Sign_26<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @Num2Bits_23::@Num2Bits_23::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + } + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + %10 = struct.readm %9[@out] : <@Num2Bits_23::@Num2Bits_23<[]>>, !array.type<254 x !felt.type<"babybear">> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %14 = cast.toindex %8 : !felt.type<"babybear"> + array.write %13[%14] = %12 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %13 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Sign_26::@Sign_26<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@Sign_26::@Sign_26<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %18 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %19 = function.call @Sign_26::@Sign_26::@compute(%18) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_26::@Sign_26<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Sign_26::@Sign_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_26::@Sign_26<[]>> + } + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_26::@Sign_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_26::@Sign_26<[]>> + %4 = struct.readm %3[@sign] : <@Sign_26::@Sign_26<[]>>, !felt.type<"babybear"> + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@IsPositive_27::@IsPositive_27<[]>>, !felt.type<"babybear"> + struct.writem %self[@sign$inputs] = %pod_0 : <@IsPositive_27::@IsPositive_27<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_26::@Sign_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_26::@Sign_26<[]>> + struct.writem %self[@sign] = %6 : <@IsPositive_27::@IsPositive_27<[]>>, !struct.type<@Sign_26::@Sign_26<[]>> + struct.writem %self[@num2Bits$inputs] = %pod_2 : <@IsPositive_27::@IsPositive_27<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + struct.writem %self[@num2Bits] = %7 : <@IsPositive_27::@IsPositive_27<[]>>, !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + function.return %self : !struct.type<@IsPositive_27::@IsPositive_27<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IsPositive_27::@IsPositive_27<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sign] : <@IsPositive_27::@IsPositive_27<[]>>, !struct.type<@Sign_26::@Sign_26<[]>> + %2 = struct.readm %arg0[@sign$inputs] : <@IsPositive_27::@IsPositive_27<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@num2Bits] : <@IsPositive_27::@IsPositive_27<[]>>, !struct.type<@Num2Bits_23::@Num2Bits_23<[]>> + %4 = struct.readm %arg0[@num2Bits$inputs] : <@IsPositive_27::@IsPositive_27<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c254 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %11 = struct.readm %3[@out] : <@Num2Bits_23::@Num2Bits_23<[]>>, !array.type<254 x !felt.type<"babybear">> + %12 = cast.toindex %10 : !felt.type<"babybear"> + %13 = array.read %11[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %15 = cast.toindex %10 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %6 = struct.readm %1[@sign] : <@Sign_26::@Sign_26<[]>>, !felt.type<"babybear"> + %7 = felt.sub %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + function.call @Sign_26::@Sign_26::@constrain(%1, %8) : (!struct.type<@Sign_26::@Sign_26<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_23::@Num2Bits_23::@constrain(%3, %9) : (!struct.type<@Num2Bits_23::@Num2Bits_23<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ReLU_28 { + struct.def @ReLU_28 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isPositive : !struct.type<@IsPositive_27::@IsPositive_27<[]>> + struct.member @isPositive$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@ReLU_28::@ReLU_28<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ReLU_28::@ReLU_28<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %7 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %8 = function.call @IsPositive_27::@IsPositive_27::@compute(%7) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_27::@IsPositive_27<[]>> + pod.write %pod[@comp] = %8 : <[@count: index, @comp: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_27::@IsPositive_27<[]>> + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_27::@IsPositive_27<[]>> + %4 = struct.readm %3[@out] : <@IsPositive_27::@IsPositive_27<[]>>, !felt.type<"babybear"> + %5 = felt.mul %arg0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> + struct.writem %self[@isPositive$inputs] = %pod_0 : <@ReLU_28::@ReLU_28<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_27::@IsPositive_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_27::@IsPositive_27<[]>> + struct.writem %self[@isPositive] = %6 : <@ReLU_28::@ReLU_28<[]>>, !struct.type<@IsPositive_27::@IsPositive_27<[]>> + function.return %self : !struct.type<@ReLU_28::@ReLU_28<[]>> + } + function.def @constrain(%arg0: !struct.type<@ReLU_28::@ReLU_28<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@isPositive] : <@ReLU_28::@ReLU_28<[]>>, !struct.type<@IsPositive_27::@IsPositive_27<[]>> + %2 = struct.readm %arg0[@isPositive$inputs] : <@ReLU_28::@ReLU_28<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %3 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = struct.readm %1[@out] : <@IsPositive_27::@IsPositive_27<[]>>, !felt.type<"babybear"> + %5 = felt.mul %arg1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @IsPositive_27::@IsPositive_27::@constrain(%1, %6) : (!struct.type<@IsPositive_27::@IsPositive_27<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @mnist_latest_precision_29 { + struct.def @mnist_latest_precision_29 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @dense_out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @conv2d_2 : !struct.type<@Conv2D_9::@Conv2D_9<[]>> + struct.member @conv2d_2$inputs : !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> + struct.member @avg2d_1 : !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> + struct.member @avg2d_1$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + struct.member @conv2d_1 : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + struct.member @conv2d_1$inputs : !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> + struct.member @bn_1 : !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> + struct.member @bn_1$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + struct.member @bn_2 : !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> + struct.member @bn_2$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> + struct.member @avg2d_2 : !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> + struct.member @avg2d_2$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + struct.member @dense : !struct.type<@Dense_17::@Dense_17<[]>> + struct.member @dense$inputs : !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> + struct.member @relu_2 : !array.type<11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> + struct.member @relu_2$inputs : !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @flatten : !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> + struct.member @flatten$inputs : !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> + struct.member @argmax : !struct.type<@ArgMax_22::@ArgMax_22<[]>> + struct.member @argmax$inputs : !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> + struct.member @relu_1 : !array.type<26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> + struct.member @relu_1$inputs : !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>, %arg5: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg6: !array.type<8 x !felt.type<"babybear">>, %arg7: !array.type<8 x !felt.type<"babybear">>, %arg8: !array.type<8 x !felt.type<"babybear">>, %arg9: !array.type<200,10 x !felt.type<"babybear">>, %arg10: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_latest_precision_29::@mnist_latest_precision_29<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c200 = arith.constant {product_source = "compute"} 200 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c2210 = arith.constant {product_source = "compute"} 2210 : index + %c968 = arith.constant {product_source = "compute"} 968 : index + %c984 = arith.constant {product_source = "compute"} 984 : index + %c2712 = arith.constant {product_source = "compute"} 2712 : index + %c824 = arith.constant {product_source = "compute"} 824 : index + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %c972 = arith.constant {product_source = "compute"} 972 : index + %self = struct.new : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c972 } : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c824 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2712 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c984 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c2210 } : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %55 = array.read %array[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %55[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg11, %arg12, %arg13] = %55 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_13 = array.new : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_14 = pod.new { @count = %c200 } : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_15 = pod.new : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_16 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_17 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_18 = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %55 = array.read %array_18[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %55[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_18[%arg11, %arg12, %arg13] = %55 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_19 = array.new : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c28 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %arg0[%57, %58, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + array.write %60[%61, %62, %c0] = %59 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %60 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %63 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %64 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %66 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %69 = function.call @Conv2D_3::@Conv2D_3::@compute(%66, %67, %68) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %69 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %63 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %64 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %arg1[%65, %66, %c0, %67] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %70 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %69[%70, %71, %c0, %72] = %68 : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@weights] = %69 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %74 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = function.call @Conv2D_3::@Conv2D_3::@compute(%76, %77, %78) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %79 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg2[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@bias] = %58 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %61 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Conv2D_3::@Conv2D_3::@compute(%63, %64, %65) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %66 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg3[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %58 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %61 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %70 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%70, %71, %72) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %arg4[%63] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %65[%66] = %64 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %65 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %68 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %70 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%70, %71, %72) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %70 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %71 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %74 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %73[%74, %75, %76] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79, %80, %81] = %77 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %78 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %82 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %83 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %85 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %87 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %88 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%85, %86, %87) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %88 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_19[%64, %65, %66] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %67[@in] = %63 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_19[%68, %69, %70] = %67 : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_18[%71, %72, %73] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %75 = pod.read %74[@count] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.subi %75, %c1 {product_source = "compute"} : index + pod.write %74[@count] = %76 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.cmpi eq, %76, %c0 {product_source = "compute"} : index + scf.if %77 { + %91 = pod.read %67[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %92 = function.call @ReLU_28::@ReLU_28::@compute(%91) : (!felt.type<"babybear">) -> !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + pod.write %74[@comp] = %92 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %93 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %94 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_18[%93, %94, %95] = %74 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %78 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_18[%78, %79, %80] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = pod.read %pod_2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %85 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %84[%85, %86, %87] = %83 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %84 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %88 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %89 = arith.subi %88, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %89 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %90 = arith.cmpi eq, %89, %c0 {product_source = "compute"} : index + scf.if %90 { + %91 = pod.read %pod_2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %92 = function.call @AveragePooling2D_7::@AveragePooling2D_7::@product(%91) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> + %93 = function.call @AveragePooling2D_7::@AveragePooling2D_7::@compute(%91) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %92 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c13 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %64[%65, %66, %67] = %63 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %64 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %69 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %74 = function.call @Conv2D_9::@Conv2D_9::@compute(%71, %72, %73) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %74 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %63 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %64 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %65 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg5[%66, %67, %68, %69] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72, %73, %74, %75] = %70 : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@weights] = %71 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %77 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %79 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %81 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = function.call @Conv2D_9::@Conv2D_9::@compute(%79, %80, %81) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %82 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg6[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@bias] = %58 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %61 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Conv2D_9::@Conv2D_9::@compute(%63, %64, %65) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %66 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg7[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %58 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %61 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %70 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%70, %71, %72) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %arg8[%63] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %65[%66] = %64 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %65 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %68 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %70 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%70, %71, %72) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %70 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %71 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %74 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %73[%74, %75, %76] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79, %80, %81] = %77 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %78 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %83 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %85 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %87 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%85, %86, %87) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %88 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_13[%64, %65, %66] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %67[@in] = %63 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_13[%68, %69, %70] = %67 : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array[%71, %72, %73] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %75 = pod.read %74[@count] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.subi %75, %c1 {product_source = "compute"} : index + pod.write %74[@count] = %76 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.cmpi eq, %76, %c0 {product_source = "compute"} : index + scf.if %77 { + %91 = pod.read %67[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %92 = function.call @ReLU_28::@ReLU_28::@compute(%91) : (!felt.type<"babybear">) -> !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + pod.write %74[@comp] = %92 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %93 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %94 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%93, %94, %95] = %74 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %78 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%78, %79, %80] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = pod.read %pod_10[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %85 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %84[%85, %86, %87] = %83 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@in] = %84 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %89 = arith.subi %88, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %89 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %90 = arith.cmpi eq, %89, %c0 {product_source = "compute"} : index + scf.if %90 { + %91 = pod.read %pod_10[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %92 = function.call @AveragePooling2D_12::@AveragePooling2D_12::@product(%91) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> + %93 = function.call @AveragePooling2D_12::@AveragePooling2D_12::@compute(%91) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %92 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c5 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %pod_15[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %64[%65, %66, %67] = %63 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@in] = %64 : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %69 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %pod_15[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = function.call @Flatten2D_13::@Flatten2D_13::@compute(%71) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %72 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c200 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + %57 = struct.readm %56[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %57[%58] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %60[%61] = %59 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@in] = %60 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %62 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %63 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %65 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %66 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %68 = function.call @Dense_17::@Dense_17::@compute(%65, %66, %67) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %68 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %65 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %arg9[%66, %67] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %70 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + array.write %69[%70, %71] = %68 : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@weights] = %69 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %73 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %75 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @Dense_17::@Dense_17::@compute(%75, %76, %77) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %78 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg10[%56] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@bias] = %58 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %61 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Dense_17::@Dense_17::@compute(%63, %64, %65) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %66 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %57 = struct.readm %56[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %57[%58] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%60] = %59 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %62[%63] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %pod_17[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %65[%66] = %64 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_17[@in] = %65 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_16[@count] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_16[@count] = %68 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %70 = pod.read %pod_17[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %71 = function.call @ArgMax_22::@ArgMax_22::@product(%70) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> + %72 = function.call @ArgMax_22::@ArgMax_22::@compute(%70) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + pod.write %pod_16[@comp] = %71 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@relu_1$inputs] = %array_19 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_20 = array.new : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %55 = array.read %array_18[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + array.write %array_20[%arg11, %arg12, %arg13] = %56 : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu_1] = %array_20 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + struct.writem %self[@bn_1$inputs] = %pod_6 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@bn_1] = %2 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@bn_2$inputs] = %pod_8 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@bn_2] = %3 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_17 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %4 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1$inputs] = %pod_4 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1] = %5 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_12 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %6 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1$inputs] = %pod_2 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1] = %7 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2$inputs] = %pod_0 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2] = %8 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_15 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %9 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@relu_2$inputs] = %array_13 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_21 = array.new : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %55 = array.read %array[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + array.write %array_21[%arg11, %arg12, %arg13] = %56 : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu_2] = %array_21 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + struct.writem %self[@avg2d_2$inputs] = %pod_10 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_2] = %10 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %11 = struct.readm %self[@out] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %self[@dense_out] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = struct.readm %self[@conv2d_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@conv2d_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %self[@avg2d_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@avg2d_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %self[@conv2d_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@conv2d_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %self[@bn_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "constrain"} + %20 = struct.readm %self[@bn_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %self[@bn_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "constrain"} + %22 = struct.readm %self[@bn_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %self[@avg2d_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "constrain"} + %24 = struct.readm %self[@avg2d_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %self[@dense] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "constrain"} + %26 = struct.readm %self[@dense$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %self[@relu_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "constrain"} + %28 = struct.readm %self[@relu_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %29 = struct.readm %self[@flatten] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "constrain"} + %30 = struct.readm %self[@flatten$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %self[@argmax] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "constrain"} + %32 = struct.readm %self[@argmax$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %self[@relu_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "constrain"} + %34 = struct.readm %self[@relu_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg11 = %c0 to %c28 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %arg0[%57, %58, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %18[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %60[%61, %62, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %61 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %62 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %arg1[%63, %64, %c0, %65] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %67 = pod.read %18[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %67[%68, %69, %c0, %70] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %66 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg2[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %18[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg3[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %20[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %arg4[%61] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %20[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %63[%64] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %66 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %67 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %68 = struct.readm %17[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = array.read %68[%69, %70, %71] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %20[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c26 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %19[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %34[%63, %64, %65] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %67 = pod.read %66[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %33[%68, %69, %70] : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %16[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c13 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %15[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %14[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %63[%64, %65, %66] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %61 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %62 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %63 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %arg5[%64, %65, %66, %67] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %69 = pod.read %14[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %70 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %74 = array.read %69[%70, %71, %72, %73] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %74, %68 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg6[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %14[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg7[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %22[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %arg8[%61] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %22[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %63[%64] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %66 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %67 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %68 = struct.readm %13[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = array.read %68[%69, %70, %71] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %22[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c11 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %21[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %28[%63, %64, %65] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %67 = pod.read %66[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %27[%68, %69, %70] : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %24[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c5 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %23[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %30[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %63[%64, %65, %66] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c200 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = struct.readm %29[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %56[%57] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = pod.read %26[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %59[%60] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %62 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %arg9[%63, %64] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = pod.read %26[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = array.read %66[%67, %68] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %69, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg10[%56] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %26[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = struct.readm %25[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %56[%57] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %12[%59] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = struct.readm %25[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %61[%62] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %32[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %64[%65] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %35 = struct.readm %31[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %55 = array.read %33[%arg11, %arg12, %arg13] : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %56 = array.read %34[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_28::@ReLU_28::@constrain(%55, %57) : (!struct.type<@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = pod.read %20[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %20[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = pod.read %20[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@constrain(%19, %36, %37, %38) : (!struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %39 = pod.read %22[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = pod.read %22[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = pod.read %22[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@constrain(%21, %39, %40, %41) : (!struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %42 = pod.read %32[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_22::@ArgMax_22::@constrain(%31, %42) : (!struct.type<@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %43 = pod.read %18[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = pod.read %18[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = pod.read %18[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%17, %43, %44, %45) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %46 = pod.read %26[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = pod.read %26[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = pod.read %26[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_17::@Dense_17::@constrain(%25, %46, %47, %48) : (!struct.type<@Dense_17::@Dense_17<[]>>, !array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %49 = pod.read %16[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_7::@AveragePooling2D_7::@constrain(%15, %49) : (!struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %50 = pod.read %14[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = pod.read %14[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = pod.read %14[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_9::@Conv2D_9::@constrain(%13, %50, %51, %52) : (!struct.type<@Conv2D_9::@Conv2D_9<[]>>, !array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %53 = pod.read %30[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_13::@Flatten2D_13::@constrain(%29, %53) : (!struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<5,5,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %55 = array.read %27[%arg11, %arg12, %arg13] : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %56 = array.read %28[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_28::@ReLU_28::@constrain(%55, %57) : (!struct.type<@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %54 = pod.read %24[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_12::@AveragePooling2D_12::@constrain(%23, %54) : (!struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@mnist_latest_precision_29::@mnist_latest_precision_29<[]>> + } + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>, %arg5: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg6: !array.type<8 x !felt.type<"babybear">>, %arg7: !array.type<8 x !felt.type<"babybear">>, %arg8: !array.type<8 x !felt.type<"babybear">>, %arg9: !array.type<200,10 x !felt.type<"babybear">>, %arg10: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_latest_precision_29::@mnist_latest_precision_29<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c200 = arith.constant {product_source = "compute"} 200 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c2210 = arith.constant {product_source = "compute"} 2210 : index + %c968 = arith.constant {product_source = "compute"} 968 : index + %c984 = arith.constant {product_source = "compute"} 984 : index + %c2712 = arith.constant {product_source = "compute"} 2712 : index + %c824 = arith.constant {product_source = "compute"} 824 : index + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %c972 = arith.constant {product_source = "compute"} 972 : index + %self = struct.new : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c972 } : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c824 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2712 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c984 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c2210 } : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %11 = array.read %array[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg11, %arg12, %arg13] = %11 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_13 = array.new : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_14 = pod.new { @count = %c200 } : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_15 = pod.new : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_16 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_17 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_18 = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %11 = array.read %array_18[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_18[%arg11, %arg12, %arg13] = %11 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_19 = array.new : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c28 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%13, %14, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18, %c0] = %15 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %16 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @Conv2D_3::@Conv2D_3::@compute(%22, %23, %24) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %25 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %20 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg1[%21, %22, %c0, %23] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%26, %27, %c0, %28] = %24 : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@weights] = %25 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %30 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @Conv2D_3::@Conv2D_3::@compute(%32, %33, %34) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg2[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@bias] = %14 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %17 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_4[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_4[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_4[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Conv2D_3::@Conv2D_3::@compute(%19, %20, %21) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg3[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %14 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %26 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%26, %27, %28) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg4[%19] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %21 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %24 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%26, %27, %28) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %26 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %27 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %29[%30, %31, %32] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35, %36, %37] = %33 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %34 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %39 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_6[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_6[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %43 = pod.read %pod_6[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%41, %42, %43) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %44 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_19[%20, %21, %22] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@in] = %19 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_19[%24, %25, %26] = %23 : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_18[%27, %28, %29] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@count] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %30[@count] = %32 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %47 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = function.call @ReLU_28::@ReLU_28::@compute(%47) : (!felt.type<"babybear">) -> !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + pod.write %30[@comp] = %48 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %49 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_18[%49, %50, %51] = %30 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_18[%34, %35, %36] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41, %42, %43] = %39 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %40 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %45 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @AveragePooling2D_7::@AveragePooling2D_7::@compute(%47) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %48 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c13 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21, %22, %23] = %19 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %20 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %25 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Conv2D_9::@Conv2D_9::@compute(%27, %28, %29) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %20 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %21 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg5[%22, %23, %24, %25] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28, %29, %30, %31] = %26 : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@weights] = %27 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %33 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %35 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @Conv2D_9::@Conv2D_9::@compute(%35, %36, %37) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %38 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg6[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@bias] = %14 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_0[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_0[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Conv2D_9::@Conv2D_9::@compute(%19, %20, %21) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg7[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %14 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %17 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %26 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%26, %27, %28) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg8[%19] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %21 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %24 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%26, %27, %28) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %26 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %27 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %29[%30, %31, %32] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35, %36, %37] = %33 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %34 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %39 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_8[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %43 = pod.read %pod_8[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%41, %42, %43) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %44 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_13[%20, %21, %22] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@in] = %19 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_13[%24, %25, %26] = %23 : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array[%27, %28, %29] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@count] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %30[@count] = %32 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %47 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = function.call @ReLU_28::@ReLU_28::@compute(%47) : (!felt.type<"babybear">) -> !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + pod.write %30[@comp] = %48 : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %49 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %30 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%34, %35, %36] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_10[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41, %42, %43] = %39 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@in] = %40 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %45 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_10[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @AveragePooling2D_12::@AveragePooling2D_12::@compute(%47) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %48 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c5 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_15[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21, %22, %23] = %19 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@in] = %20 : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %25 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_15[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Flatten2D_13::@Flatten2D_13::@compute(%27) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %28 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c200 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17] = %15 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@in] = %16 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %19 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %21 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @Dense_17::@Dense_17::@compute(%21, %22, %23) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %24 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %21 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg9[%22, %23] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%26, %27] = %24 : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@weights] = %25 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %29 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %31 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Dense_17::@Dense_17::@compute(%31, %32, %33) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %34 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg10[%12] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@bias] = %14 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %17 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_12[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_12[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_12[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Dense_17::@Dense_17::@compute(%19, %20, %21) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %22 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %18[%19] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_17[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_17[@in] = %21 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_16[@count] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_16[@count] = %24 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_17[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @ArgMax_22::@ArgMax_22::@compute(%26) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + pod.write %pod_16[@comp] = %27 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@relu_1$inputs] = %array_19 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_20 = array.new : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %11 = array.read %array_18[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + array.write %array_20[%arg11, %arg12, %arg13] = %12 : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu_1] = %array_20 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + struct.writem %self[@bn_1$inputs] = %pod_6 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@bn_1] = %2 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@bn_2$inputs] = %pod_8 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@bn_2] = %3 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_17 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %4 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1$inputs] = %pod_4 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1] = %5 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_12 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %6 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1$inputs] = %pod_2 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1] = %7 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2$inputs] = %pod_0 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2] = %8 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_15 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %9 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@relu_2$inputs] = %array_13 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_21 = array.new : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %11 = array.read %array[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ReLU_28::@ReLU_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + array.write %array_21[%arg11, %arg12, %arg13] = %12 : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu_2] = %array_21 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "compute"} + struct.writem %self[@avg2d_2$inputs] = %pod_10 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_2] = %10 : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@mnist_latest_precision_29::@mnist_latest_precision_29<[]>> + } + function.def @constrain(%arg0: !struct.type<@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>, %arg5: !array.type<4 x !felt.type<"babybear">>, %arg6: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg7: !array.type<8 x !felt.type<"babybear">>, %arg8: !array.type<8 x !felt.type<"babybear">>, %arg9: !array.type<8 x !felt.type<"babybear">>, %arg10: !array.type<200,10 x !felt.type<"babybear">>, %arg11: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant 10 : index + %c200 = arith.constant 200 : index + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c8 = arith.constant {product_source = "constrain"} 8 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c26 = arith.constant {product_source = "constrain"} 26 : index + %0 = struct.readm %arg0[@out] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@dense_out] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@conv2d_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@conv2d_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@avg2d_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@avg2d_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@conv2d_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@conv2d_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %arg0[@bn_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@bn_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = struct.readm %arg0[@bn_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "constrain"} + %11 = struct.readm %arg0[@bn_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = struct.readm %arg0[@avg2d_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "constrain"} + %13 = struct.readm %arg0[@avg2d_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = struct.readm %arg0[@dense] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "constrain"} + %15 = struct.readm %arg0[@dense$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = struct.readm %arg0[@relu_2] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "constrain"} + %17 = struct.readm %arg0[@relu_2$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@flatten] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "constrain"} + %19 = struct.readm %arg0[@flatten$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = struct.readm %arg0[@argmax] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "constrain"} + %21 = struct.readm %arg0[@argmax$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = struct.readm %arg0[@relu_1] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>> {product_source = "constrain"} + %23 = struct.readm %arg0[@relu_1$inputs] : <@mnist_latest_precision_29::@mnist_latest_precision_29<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c28 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %arg1[%46, %47, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = pod.read %7[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %49[%50, %51, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c4 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %50 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c3 step %c1 { + %51 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %arg2[%52, %53, %c0, %54] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = pod.read %7[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %56[%57, %58, %c0, %59] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg3[%45] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %7[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c4 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg4[%45] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %9[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %arg5[%50] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %9[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %55 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c26 step %c1 { + %56 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %57 = struct.readm %6[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %57[%58, %59, %60] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %9[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %8[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %23[%52, %53, %54] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %56 = pod.read %55[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %22[%57, %58, %59] : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %61 = struct.readm %60[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %5[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c13 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %4[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %3[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %52[%53, %54, %55] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %50 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c3 step %c1 { + %51 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg15 = %c0 to %c4 step %c1 { + %52 = cast.tofelt %arg15 : index, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg6[%53, %54, %55, %56] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %3[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %58[%59, %60, %61, %62] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg7[%45] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %3[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg8[%45] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %11[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %arg9[%50] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %11[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %55 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c11 step %c1 { + %56 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %57 = struct.readm %2[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %57[%58, %59, %60] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %11[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c8 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %10[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %17[%52, %53, %54] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %56 = pod.read %55[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %16[%57, %58, %59] : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %61 = struct.readm %60[@out] : <@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %13[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c5 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c8 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %12[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %19[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %52[%53, %54, %55] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c200 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = struct.readm %18[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = pod.read %15[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %48[%49] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c10 step %c1 { + %51 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %arg10[%52, %53] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = pod.read %15[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %55[%56, %57] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %58, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg11[%45] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %15[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = struct.readm %14[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %1[%48] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = struct.readm %14[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = pod.read %21[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %54 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %53[%54] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %24 = struct.readm %20[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c26 step %c1 { + scf.for %arg14 = %c0 to %c4 step %c1 { + %44 = array.read %22[%arg12, %arg13, %arg14] : <26,26,4 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %45 = array.read %23[%arg12, %arg13, %arg14] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_28::@ReLU_28::@constrain(%44, %46) : (!struct.type<@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %25 = pod.read %9[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = pod.read %9[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = pod.read %9[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@constrain(%8, %25, %26, %27) : (!struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %28 = pod.read %11[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = pod.read %11[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = pod.read %11[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@constrain(%10, %28, %29, %30) : (!struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %31 = pod.read %21[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_22::@ArgMax_22::@constrain(%20, %31) : (!struct.type<@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %32 = pod.read %7[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = pod.read %7[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = pod.read %7[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%6, %32, %33, %34) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %35 = pod.read %15[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = pod.read %15[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %15[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_17::@Dense_17::@constrain(%14, %35, %36, %37) : (!struct.type<@Dense_17::@Dense_17<[]>>, !array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %38 = pod.read %5[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_7::@AveragePooling2D_7::@constrain(%4, %38) : (!struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %39 = pod.read %3[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = pod.read %3[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = pod.read %3[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_9::@Conv2D_9::@constrain(%2, %39, %40, %41) : (!struct.type<@Conv2D_9::@Conv2D_9<[]>>, !array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %42 = pod.read %19[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_13::@Flatten2D_13::@constrain(%18, %42) : (!struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<5,5,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c11 step %c1 { + scf.for %arg14 = %c0 to %c8 step %c1 { + %44 = array.read %16[%arg12, %arg13, %arg14] : <11,11,8 x !struct.type<@ReLU_28::@ReLU_28<[]>>>, !struct.type<@ReLU_28::@ReLU_28<[]>> {product_source = "constrain"} + %45 = array.read %17[%arg12, %arg13, %arg14] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_28::@ReLU_28::@constrain(%44, %46) : (!struct.type<@ReLU_28::@ReLU_28<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %43 = pod.read %13[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_12::@AveragePooling2D_12::@constrain(%12, %43) : (!struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mnist_latest_test.llzk b/examples/circom-demo/mnist_latest_test.llzk new file mode 100644 index 0000000..2353968 --- /dev/null +++ b/examples/circom-demo/mnist_latest_test.llzk @@ -0,0 +1,5931 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@mnist_latest_25::@mnist_latest_25<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg0[%2, %3] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10] = %8 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = cast.toindex %2 : !felt.type<"babybear"> + %5 = array.read %arg1[%3, %4] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg2[%6, %7] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<9 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %nondet[%9] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %arg0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %arg4 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + %2 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %7 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = cast.toindex %8 : !felt.type<"babybear"> + %16 = array.read %arg1[%14, %15] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %arg5 : !felt.type<"babybear"> + %19 = array.read %1[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %10 : !felt.type<"babybear"> + } + scf.yield %7 : !felt.type<"babybear"> + } + %5 = array.read %1[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<1 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %self = struct.new : <@Sum_2::@Sum_2<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_3 { + struct.def @Conv2D_3 { + struct.member @out : !array.type<26,26,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @sum : !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c18 = arith.constant 18 : index + %c9 = arith.constant 9 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> + %nondet = llzk.nondet : !array.type<26,26,4 x !felt.type<"babybear">> + %array = array.new : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %c0, %arg5] = %0 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %arg5] = %0 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_2 = array.new : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %array_3 = array.new : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %c0, %arg5] = %0 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_4 = array.new : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %5 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %8, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%7, %10, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + %15 = array.read %array_4[%12, %13, %c0, %14] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %17 = cast.toindex %3 : !felt.type<"babybear"> + %18 = cast.toindex %4 : !felt.type<"babybear"> + array.write %16[%17, %18] = %11 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %0 : !felt.type<"babybear"> + %20 = cast.toindex %1 : !felt.type<"babybear"> + %21 = cast.toindex %2 : !felt.type<"babybear"> + %22 = array.read %array_4[%19, %20, %c0, %21] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %22[@a] = %16 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_4[%23, %24, %c0, %25] = %22 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %array_3[%26, %27, %c0, %28] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %58 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %59 = pod.read %22[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %60 = function.call @matElemMul_0::@matElemMul_0::@compute(%58, %59) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %29[@comp] = %60 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_3[%61, %62, %c0, %63] = %29 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %33 = cast.toindex %3 : !felt.type<"babybear"> + %34 = cast.toindex %4 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %arg1[%33, %34, %c0, %35] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = cast.toindex %2 : !felt.type<"babybear"> + %40 = array.read %array_4[%37, %38, %c0, %39] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %41 = pod.read %40[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %42 = cast.toindex %3 : !felt.type<"babybear"> + %43 = cast.toindex %4 : !felt.type<"babybear"> + array.write %41[%42, %43] = %36 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %0 : !felt.type<"babybear"> + %45 = cast.toindex %1 : !felt.type<"babybear"> + %46 = cast.toindex %2 : !felt.type<"babybear"> + %47 = array.read %array_4[%44, %45, %c0, %46] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %47[@b] = %41 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %48 = cast.toindex %0 : !felt.type<"babybear"> + %49 = cast.toindex %1 : !felt.type<"babybear"> + %50 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_4[%48, %49, %c0, %50] = %47 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + %53 = cast.toindex %2 : !felt.type<"babybear"> + %54 = array.read %array_3[%51, %52, %c0, %53] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %55 = pod.read %54[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %56 = arith.subi %55, %c1 : index + pod.write %54[@count] = %56 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %57 = arith.cmpi eq, %56, %c0 : index + scf.if %57 { + %58 = pod.read %47[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %59 = pod.read %47[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %60 = function.call @matElemMul_0::@matElemMul_0::@compute(%58, %59) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %54[@comp] = %60 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_3[%61, %62, %c0, %63] = %54 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %array_3[%5, %6, %c0, %7] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %10 = struct.readm %9[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = array.read %10[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = array.read %array_0[%14, %15, %c0, %16] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %19 = cast.toindex %3 : !felt.type<"babybear"> + %20 = cast.toindex %4 : !felt.type<"babybear"> + array.write %18[%19, %20] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = cast.toindex %2 : !felt.type<"babybear"> + %24 = array.read %array_0[%21, %22, %c0, %23] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %24[@a] = %18 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = cast.toindex %1 : !felt.type<"babybear"> + %27 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%25, %26, %c0, %27] = %24 : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = cast.toindex %1 : !felt.type<"babybear"> + %30 = cast.toindex %2 : !felt.type<"babybear"> + %31 = array.read %array[%28, %29, %c0, %30] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %35 = pod.read %24[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %36 = function.call @matElemSum_1::@matElemSum_1::@compute(%35) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %31[@comp] = %36 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%37, %38, %c0, %39] = %31 : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %15 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%15) + } do { + %15 = cast.toindex %0 : !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = cast.toindex %2 : !felt.type<"babybear"> + %18 = array.read %array[%15, %16, %c0, %17] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %20 = struct.readm %19[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + %23 = cast.toindex %2 : !felt.type<"babybear"> + %24 = array.read %array_2[%21, %22, %23] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %25 = pod.read %24[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + array.write %25[%c0] = %20 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = cast.toindex %1 : !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %array_2[%26, %27, %28] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + pod.write %29[@in] = %25 : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %30 = cast.toindex %0 : !felt.type<"babybear"> + %31 = cast.toindex %1 : !felt.type<"babybear"> + %32 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_2[%30, %31, %32] = %29 : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %array_1[%33, %34, %35] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %29[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %41 = function.call @Sum_2::@Sum_2::@compute(%40) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + pod.write %36[@comp] = %41 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %42 = cast.toindex %0 : !felt.type<"babybear"> + %43 = cast.toindex %1 : !felt.type<"babybear"> + %44 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_1[%42, %43, %44] = %36 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array_1[%3, %4, %5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = struct.readm %7[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%12, %13, %14] = %11 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@sum$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %array_5 = array.new : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + array.write %array_5[%arg3, %arg4, %arg5] = %1 : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + } + } + } + struct.writem %self[@sum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.writem %self[@elemSum$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_6 = array.new : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_6[%arg3, %arg4, %c0, %arg5] = %1 : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@mul$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_7 = array.new : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %c0, %arg5] : <26,26,1,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_7[%arg3, %arg4, %c0, %arg5] = %1 : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + } + struct.writem %self[@mul] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c26 = arith.constant 26 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>> + %4 = struct.readm %arg0[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %6 = struct.readm %arg0[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c26 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c26 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %12 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%14, %17, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %7 : !felt.type<"babybear"> + %20 = cast.toindex %8 : !felt.type<"babybear"> + %21 = cast.toindex %9 : !felt.type<"babybear"> + %22 = array.read %6[%19, %20, %c0, %21] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %23 = pod.read %22[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %24 = cast.toindex %10 : !felt.type<"babybear"> + %25 = cast.toindex %11 : !felt.type<"babybear"> + %26 = array.read %23[%24, %25] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %10 : !felt.type<"babybear"> + %28 = cast.toindex %11 : !felt.type<"babybear"> + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = array.read %arg2[%27, %28, %c0, %29] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %7 : !felt.type<"babybear"> + %32 = cast.toindex %8 : !felt.type<"babybear"> + %33 = cast.toindex %9 : !felt.type<"babybear"> + %34 = array.read %6[%31, %32, %c0, %33] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %35 = pod.read %34[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %36 = cast.toindex %10 : !felt.type<"babybear"> + %37 = cast.toindex %11 : !felt.type<"babybear"> + %38 = array.read %35[%36, %37] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %12 = cast.toindex %7 : !felt.type<"babybear"> + %13 = cast.toindex %8 : !felt.type<"babybear"> + %14 = cast.toindex %9 : !felt.type<"babybear"> + %15 = array.read %5[%12, %13, %c0, %14] : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %16 = struct.readm %15[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %17 = cast.toindex %10 : !felt.type<"babybear"> + %18 = cast.toindex %11 : !felt.type<"babybear"> + %19 = array.read %16[%17, %18] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %7 : !felt.type<"babybear"> + %21 = cast.toindex %8 : !felt.type<"babybear"> + %22 = cast.toindex %9 : !felt.type<"babybear"> + %23 = array.read %2[%20, %21, %c0, %22] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %24 = pod.read %23[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %11 : !felt.type<"babybear"> + %27 = array.read %24[%25, %26] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %22 = bool.cmp lt(%arg7, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%22) + } do { + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = cast.toindex %9 : !felt.type<"babybear"> + %25 = array.read %1[%22, %23, %c0, %24] : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %26 = struct.readm %25[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %27 = cast.toindex %7 : !felt.type<"babybear"> + %28 = cast.toindex %8 : !felt.type<"babybear"> + %29 = cast.toindex %9 : !felt.type<"babybear"> + %30 = array.read %4[%27, %28, %29] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %31 = pod.read %30[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %32 = array.read %31[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %10 = cast.toindex %7 : !felt.type<"babybear"> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %3[%10, %11, %12] : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %14 = struct.readm %13[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %arg3[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %0[%18, %19, %20] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %3[%arg4, %arg5, %arg6] : <26,26,4 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = array.read %4[%arg4, %arg5, %arg6] : <26,26,4 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %1[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %2[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + %7 = array.read %5[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %6[%arg4, %arg5, %c0, %arg6] : <26,26,1,4 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @BatchNormalization2D_4 { + struct.def @BatchNormalization2D_4 { + struct.member @out : !array.type<26,26,4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> + %nondet = llzk.nondet : !array.type<26,26,4 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c26 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg0[%5, %6, %7] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %4, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%13, %14, %15] = %12 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@out] = %nondet : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c26 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg2[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg1[%6, %7, %8] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg3[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %0[%14, %15, %16] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + function.return + } + } + } + poly.template @matElemSum_5 { + struct.def @matElemSum_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<4 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@matElemSum_5::@matElemSum_5<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %arg0[%11, %12] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %arg4 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + %2 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_5::@matElemSum_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<4 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %7 = scf.for %arg4 = %c0 to %c2 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = cast.toindex %8 : !felt.type<"babybear"> + %16 = array.read %arg1[%14, %15] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %arg5 : !felt.type<"babybear"> + %19 = array.read %1[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %10 : !felt.type<"babybear"> + } + scf.yield %7 : !felt.type<"babybear"> + } + %5 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @SumPooling2D_6 { + struct.def @SumPooling2D_6 { + struct.member @out : !array.type<13,13,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.member @elemSum$inputs : !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c13 = arith.constant 13 : index + %self = struct.new : <@SumPooling2D_6::@SumPooling2D_6<[]>> + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> + %array = array.new : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1, %arg2, %arg3] = %0 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg1 = %c0 to %c13 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c13 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %arg0[%16, %19, %20] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = array.read %array_0[%22, %23, %24] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %27 = cast.toindex %12 : !felt.type<"babybear"> + %28 = cast.toindex %13 : !felt.type<"babybear"> + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_0[%29, %30, %31] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%33, %34, %35] = %32 : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array[%36, %37, %38] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %44 = function.call @matElemSum_5::@matElemSum_5::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%45, %46, %47] = %39 : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + } + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array[%3, %4, %5] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9, %10, %11] = %8 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + scf.for %arg1 = %c0 to %c13 step %c1 { + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c4 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <13,13,4 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.writem %self[@out] = %nondet : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c13 = arith.constant 13 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c13 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %arg1[%19, %22, %23] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = cast.toindex %4 : !felt.type<"babybear"> + %27 = cast.toindex %5 : !felt.type<"babybear"> + %28 = array.read %2[%25, %26, %27] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %30 = cast.toindex %15 : !felt.type<"babybear"> + %31 = cast.toindex %16 : !felt.type<"babybear"> + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %1[%6, %7, %8] : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %10 = struct.readm %9[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %0[%11, %12, %13] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg2 = %c0 to %c13 step %c1 { + scf.for %arg3 = %c0 to %c13 step %c1 { + scf.for %arg4 = %c0 to %c4 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <13,13,4 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %4 = array.read %2[%arg2, %arg3, %arg4] : <13,13,4 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + function.call @matElemSum_5::@matElemSum_5::@constrain(%3, %5) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @AveragePooling2D_7 { + struct.def @AveragePooling2D_7 { + struct.member @out : !array.type<13,13,4 x !felt.type<"babybear">> {llzk.pub} + struct.member @sumPooling2D : !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + struct.member @sumPooling2D$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c13 = arith.constant 13 : index + %c4 = arith.constant 4 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_25 = felt.const 25 : <"babybear"> + %c2704 = arith.constant 2704 : index + %self = struct.new : <@AveragePooling2D_7::@AveragePooling2D_7<[]>> + %nondet = llzk.nondet : !array.type<13,13,4 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c26 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %arg0[%4, %5, %6] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> + %9 = cast.toindex %1 : !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9, %10, %11] = %7 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %8 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.subi %12, %c1 : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.cmpi eq, %13, %c0 : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> + %16 = function.call @SumPooling2D_6::@SumPooling2D_6::@compute(%15) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + } + } + } + } + scf.for %arg1 = %c0 to %c13 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c13 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + %5 = struct.readm %4[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %5[%6, %7, %8] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%11, %12, %13] = %10 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + struct.writem %self[@out] = %nondet : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + function.return %self : !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, %arg1: !array.type<26,26,4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c13 = arith.constant 13 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %felt_const_25 = felt.const 25 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@sumPooling2D] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>> + %2 = struct.readm %arg0[@sumPooling2D$inputs] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c26 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c26 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = cast.toindex %6 : !felt.type<"babybear"> + %10 = array.read %arg1[%7, %8, %9] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = array.read %11[%12, %13, %14] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg2 = %c0 to %c13 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c13 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = struct.readm %1[@out] : <@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = cast.toindex %6 : !felt.type<"babybear"> + %11 = array.read %7[%8, %9, %10] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.mul %11, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = cast.toindex %6 : !felt.type<"babybear"> + %16 = array.read %0[%13, %14, %15] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + %3 = pod.read %2[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> + function.call @SumPooling2D_6::@SumPooling2D_6::@constrain(%1, %3) : (!struct.type<@SumPooling2D_6::@SumPooling2D_6<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Sum_8 { + struct.def @Sum_8 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<4 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Sum_8::@Sum_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Sum_8::@Sum_8<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c1 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %2 : !felt.type<"babybear"> + %7 = array.read %arg0[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %1 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_8::@Sum_8<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_8::@Sum_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_8::@Sum_8<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_8::@Sum_8<[]>>, !array.type<4 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = array.read %1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_9 { + struct.def @Conv2D_9 { + struct.member @out : !array.type<11,11,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @sum : !array.type<11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + struct.member @sum$inputs : !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @elemSum : !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<13,13,4 x !felt.type<"babybear">>, %arg1: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %c9 = arith.constant 9 : index + %c18 = arith.constant 18 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c11 = arith.constant 11 : index + %self = struct.new : <@Conv2D_9::@Conv2D_9<[]>> + %nondet = llzk.nondet : !array.type<11,11,8 x !felt.type<"babybear">> + %array = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %arg5] = %0 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %array_1 = array.new : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %arg5, %arg6] = %0 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_2 = array.new : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %arg5, %arg6] = %0 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + %array_4 = array.new : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c11 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %6 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = array.read %arg0[%8, %11, %12] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %0 : !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = cast.toindex %3 : !felt.type<"babybear"> + %18 = array.read %array_2[%14, %15, %16, %17] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %20 = cast.toindex %4 : !felt.type<"babybear"> + %21 = cast.toindex %5 : !felt.type<"babybear"> + array.write %19[%20, %21] = %13 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = array.read %array_2[%22, %23, %24, %25] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %26[@a] = %19 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %27 = cast.toindex %0 : !felt.type<"babybear"> + %28 = cast.toindex %1 : !felt.type<"babybear"> + %29 = cast.toindex %2 : !felt.type<"babybear"> + %30 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_2[%27, %28, %29, %30] = %26 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %31 = cast.toindex %0 : !felt.type<"babybear"> + %32 = cast.toindex %1 : !felt.type<"babybear"> + %33 = cast.toindex %2 : !felt.type<"babybear"> + %34 = cast.toindex %3 : !felt.type<"babybear"> + %35 = array.read %array_1[%31, %32, %33, %34] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.subi %36, %c1 : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.cmpi eq, %37, %c0 : index + scf.if %38 { + %69 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %70 = pod.read %26[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %35[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %72 = cast.toindex %0 : !felt.type<"babybear"> + %73 = cast.toindex %1 : !felt.type<"babybear"> + %74 = cast.toindex %2 : !felt.type<"babybear"> + %75 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_1[%72, %73, %74, %75] = %35 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %39 = cast.toindex %4 : !felt.type<"babybear"> + %40 = cast.toindex %5 : !felt.type<"babybear"> + %41 = cast.toindex %2 : !felt.type<"babybear"> + %42 = cast.toindex %3 : !felt.type<"babybear"> + %43 = array.read %arg1[%39, %40, %41, %42] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %0 : !felt.type<"babybear"> + %45 = cast.toindex %1 : !felt.type<"babybear"> + %46 = cast.toindex %2 : !felt.type<"babybear"> + %47 = cast.toindex %3 : !felt.type<"babybear"> + %48 = array.read %array_2[%44, %45, %46, %47] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %49 = pod.read %48[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %50 = cast.toindex %4 : !felt.type<"babybear"> + %51 = cast.toindex %5 : !felt.type<"babybear"> + array.write %49[%50, %51] = %43 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = cast.toindex %0 : !felt.type<"babybear"> + %53 = cast.toindex %1 : !felt.type<"babybear"> + %54 = cast.toindex %2 : !felt.type<"babybear"> + %55 = cast.toindex %3 : !felt.type<"babybear"> + %56 = array.read %array_2[%52, %53, %54, %55] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %56[@b] = %49 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %57 = cast.toindex %0 : !felt.type<"babybear"> + %58 = cast.toindex %1 : !felt.type<"babybear"> + %59 = cast.toindex %2 : !felt.type<"babybear"> + %60 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_2[%57, %58, %59, %60] = %56 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %61 = cast.toindex %0 : !felt.type<"babybear"> + %62 = cast.toindex %1 : !felt.type<"babybear"> + %63 = cast.toindex %2 : !felt.type<"babybear"> + %64 = cast.toindex %3 : !felt.type<"babybear"> + %65 = array.read %array_1[%61, %62, %63, %64] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %66 = pod.read %65[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %67 = arith.subi %66, %c1 : index + pod.write %65[@count] = %67 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %68 = arith.cmpi eq, %67, %c0 : index + scf.if %68 { + %69 = pod.read %56[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %70 = pod.read %56[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %71 = function.call @matElemMul_0::@matElemMul_0::@compute(%69, %70) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %65[@comp] = %71 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %72 = cast.toindex %0 : !felt.type<"babybear"> + %73 = cast.toindex %1 : !felt.type<"babybear"> + %74 = cast.toindex %2 : !felt.type<"babybear"> + %75 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_1[%72, %73, %74, %75] = %65 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg7 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %array_1[%6, %7, %8, %9] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = array.read %12[%13, %14] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = cast.toindex %2 : !felt.type<"babybear"> + %19 = cast.toindex %3 : !felt.type<"babybear"> + %20 = array.read %array_4[%16, %17, %18, %19] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %22 = cast.toindex %4 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + array.write %21[%22, %23] = %15 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %0 : !felt.type<"babybear"> + %25 = cast.toindex %1 : !felt.type<"babybear"> + %26 = cast.toindex %2 : !felt.type<"babybear"> + %27 = cast.toindex %3 : !felt.type<"babybear"> + %28 = array.read %array_4[%24, %25, %26, %27] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %28[@a] = %21 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_4[%29, %30, %31, %32] = %28 : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = cast.toindex %3 : !felt.type<"babybear"> + %37 = array.read %array_3[%33, %34, %35, %36] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %41 = pod.read %28[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %42 = function.call @matElemSum_1::@matElemSum_1::@compute(%41) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %37[@comp] = %42 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + %44 = cast.toindex %1 : !felt.type<"babybear"> + %45 = cast.toindex %2 : !felt.type<"babybear"> + %46 = cast.toindex %3 : !felt.type<"babybear"> + array.write %array_3[%43, %44, %45, %46] = %37 : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + } + } + scf.for %arg5 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %15 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = cast.toindex %2 : !felt.type<"babybear"> + %20 = array.read %array_3[%16, %17, %18, %19] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %22 = struct.readm %21[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + %26 = array.read %array_0[%23, %24, %25] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %28 = cast.toindex %15 : !felt.type<"babybear"> + array.write %27[%28] = %22 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_0[%29, %30, %31] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + pod.write %32[@in] = %27 : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%33, %34, %35] = %32 : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array[%36, %37, %38] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %44 = function.call @Sum_8::@Sum_8::@compute(%43) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Sum_8::@Sum_8<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_8::@Sum_8<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%45, %46, %47] = %39 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array[%3, %4, %5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_8::@Sum_8<[]>> + %8 = struct.readm %7[@out] : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%12, %13, %14] = %11 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_4 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_5 = array.new : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_5[%arg3, %arg4, %arg5, %arg6] = %1 : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + } + } + struct.writem %self[@elemSum] = %array_5 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@sum$inputs] = %array_0 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %array_6 = array.new : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg3, %arg4, %arg5] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_8::@Sum_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_8::@Sum_8<[]>> + array.write %array_6[%arg3, %arg4, %arg5] = %1 : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>>, !struct.type<@Sum_8::@Sum_8<[]>> + } + } + } + struct.writem %self[@sum] = %array_6 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + struct.writem %self[@mul$inputs] = %array_2 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_7 = array.new : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c11 step %c1 { + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c4 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %arg5, %arg6] : <11,11,4,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_7[%arg3, %arg4, %arg5, %arg6] = %1 : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + } + } + struct.writem %self[@mul] = %array_7 : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_9::@Conv2D_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, %arg1: !array.type<13,13,4 x !felt.type<"babybear">>, %arg2: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg3: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c4 = arith.constant 4 : index + %c11 = arith.constant 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@sum] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>> + %2 = struct.readm %arg0[@sum$inputs] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@mul] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@mul$inputs] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@elemSum] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %6 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c11 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c11 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c8 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %13 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = cast.toindex %9 : !felt.type<"babybear"> + %20 = array.read %arg1[%15, %18, %19] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %7 : !felt.type<"babybear"> + %22 = cast.toindex %8 : !felt.type<"babybear"> + %23 = cast.toindex %9 : !felt.type<"babybear"> + %24 = cast.toindex %10 : !felt.type<"babybear"> + %25 = array.read %4[%21, %22, %23, %24] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %27 = cast.toindex %11 : !felt.type<"babybear"> + %28 = cast.toindex %12 : !felt.type<"babybear"> + %29 = array.read %26[%27, %28] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %11 : !felt.type<"babybear"> + %31 = cast.toindex %12 : !felt.type<"babybear"> + %32 = cast.toindex %9 : !felt.type<"babybear"> + %33 = cast.toindex %10 : !felt.type<"babybear"> + %34 = array.read %arg2[%30, %31, %32, %33] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = cast.toindex %7 : !felt.type<"babybear"> + %36 = cast.toindex %8 : !felt.type<"babybear"> + %37 = cast.toindex %9 : !felt.type<"babybear"> + %38 = cast.toindex %10 : !felt.type<"babybear"> + %39 = array.read %4[%35, %36, %37, %38] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %40 = pod.read %39[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %41 = cast.toindex %11 : !felt.type<"babybear"> + %42 = cast.toindex %12 : !felt.type<"babybear"> + %43 = array.read %40[%41, %42] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg8 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg8 : index, !felt.type<"babybear"> + scf.for %arg9 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg9 : index, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = cast.toindex %8 : !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = cast.toindex %10 : !felt.type<"babybear"> + %17 = array.read %3[%13, %14, %15, %16] : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %18 = struct.readm %17[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = cast.toindex %12 : !felt.type<"babybear"> + %21 = array.read %18[%19, %20] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = cast.toindex %9 : !felt.type<"babybear"> + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = array.read %6[%22, %23, %24, %25] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %27 = pod.read %26[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %28 = cast.toindex %11 : !felt.type<"babybear"> + %29 = cast.toindex %12 : !felt.type<"babybear"> + %30 = array.read %27[%28, %29] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %30, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + } + scf.for %arg6 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %23 = cast.toindex %7 : !felt.type<"babybear"> + %24 = cast.toindex %8 : !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = cast.toindex %9 : !felt.type<"babybear"> + %27 = array.read %5[%23, %24, %25, %26] : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %28 = struct.readm %27[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %29 = cast.toindex %7 : !felt.type<"babybear"> + %30 = cast.toindex %8 : !felt.type<"babybear"> + %31 = cast.toindex %9 : !felt.type<"babybear"> + %32 = array.read %2[%29, %30, %31] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %33 = pod.read %32[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %34 = cast.toindex %22 : !felt.type<"babybear"> + %35 = array.read %33[%34] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = cast.toindex %7 : !felt.type<"babybear"> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = cast.toindex %9 : !felt.type<"babybear"> + %13 = array.read %1[%10, %11, %12] : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>>, !struct.type<@Sum_8::@Sum_8<[]>> + %14 = struct.readm %13[@out] : <@Sum_8::@Sum_8<[]>>, !felt.type<"babybear"> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = array.read %arg3[%15] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %0[%18, %19, %20] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + scf.for %arg7 = %c0 to %c8 step %c1 { + %7 = array.read %5[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %6[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c8 step %c1 { + %7 = array.read %1[%arg4, %arg5, %arg6] : <11,11,8 x !struct.type<@Sum_8::@Sum_8<[]>>>, !struct.type<@Sum_8::@Sum_8<[]>> + %8 = array.read %2[%arg4, %arg5, %arg6] : <11,11,8 x !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<4 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + function.call @Sum_8::@Sum_8::@constrain(%7, %9) : (!struct.type<@Sum_8::@Sum_8<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () + } + } + } + scf.for %arg4 = %c0 to %c11 step %c1 { + scf.for %arg5 = %c0 to %c11 step %c1 { + scf.for %arg6 = %c0 to %c4 step %c1 { + scf.for %arg7 = %c0 to %c8 step %c1 { + %7 = array.read %3[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %4[%arg4, %arg5, %arg6, %arg7] : <11,11,4,8 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + } + } + function.return + } + } + } + poly.template @BatchNormalization2D_10 { + struct.def @BatchNormalization2D_10 { + struct.member @out : !array.type<11,11,8 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> + %nondet = llzk.nondet : !array.type<11,11,8 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c11 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg0[%5, %6, %7] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %4, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%13, %14, %15] = %12 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@out] = %nondet : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>, %arg2: !array.type<8 x !felt.type<"babybear">>, %arg3: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c11 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg2[%4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg1[%6, %7, %8] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg3[%11] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = cast.toindex %2 : !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %0[%14, %15, %16] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + function.return + } + } + } + poly.template @SumPooling2D_11 { + struct.def @SumPooling2D_11 { + struct.member @out : !array.type<5,5,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @elemSum : !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.member @elemSum$inputs : !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c5 = arith.constant 5 : index + %self = struct.new : <@SumPooling2D_11::@SumPooling2D_11<[]>> + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> + %array = array.new : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1, %arg2, %arg3] = %0 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + } + } + } + %array_0 = array.new : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg1 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = felt.mul %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %arg0[%16, %19, %20] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = cast.toindex %2 : !felt.type<"babybear"> + %25 = array.read %array_0[%22, %23, %24] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %26 = pod.read %25[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %27 = cast.toindex %12 : !felt.type<"babybear"> + %28 = cast.toindex %13 : !felt.type<"babybear"> + array.write %26[%27, %28] = %21 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %0 : !felt.type<"babybear"> + %30 = cast.toindex %1 : !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %array_0[%29, %30, %31] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + pod.write %32[@a] = %26 : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array_0[%33, %34, %35] = %32 : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %36 = cast.toindex %0 : !felt.type<"babybear"> + %37 = cast.toindex %1 : !felt.type<"babybear"> + %38 = cast.toindex %2 : !felt.type<"babybear"> + %39 = array.read %array[%36, %37, %38] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.subi %40, %c1 : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.cmpi eq, %41, %c0 : index + scf.if %42 { + %43 = pod.read %32[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %44 = function.call @matElemSum_5::@matElemSum_5::@compute(%43) : (!array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> + pod.write %39[@comp] = %44 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %45 = cast.toindex %0 : !felt.type<"babybear"> + %46 = cast.toindex %1 : !felt.type<"babybear"> + %47 = cast.toindex %2 : !felt.type<"babybear"> + array.write %array[%45, %46, %47] = %39 : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + } + } + } + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %array[%3, %4, %5] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9, %10, %11] = %8 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@elemSum$inputs] = %array_0 : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + scf.for %arg1 = %c0 to %c5 step %c1 { + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c8 step %c1 { + %0 = array.read %array[%arg1, %arg2, %arg3] : <5,5,8 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + array.write %array_1[%arg1, %arg2, %arg3] = %1 : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + } + } + } + struct.writem %self[@elemSum] = %array_1 : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.writem %self[@out] = %nondet : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c8 = arith.constant 8 : index + %c5 = arith.constant 5 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@elemSum] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + %2 = struct.readm %arg0[@elemSum$inputs] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %17 = felt.mul %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = felt.mul %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.add %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = cast.toindex %5 : !felt.type<"babybear"> + %24 = array.read %arg1[%19, %22, %23] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %3 : !felt.type<"babybear"> + %26 = cast.toindex %4 : !felt.type<"babybear"> + %27 = cast.toindex %5 : !felt.type<"babybear"> + %28 = array.read %2[%25, %26, %27] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %29 = pod.read %28[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + %30 = cast.toindex %15 : !felt.type<"babybear"> + %31 = cast.toindex %16 : !felt.type<"babybear"> + %32 = array.read %29[%30, %31] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %1[%6, %7, %8] : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %10 = struct.readm %9[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = array.read %0[%11, %12, %13] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + scf.for %arg3 = %c0 to %c5 step %c1 { + scf.for %arg4 = %c0 to %c8 step %c1 { + %3 = array.read %1[%arg2, %arg3, %arg4] : <5,5,8 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %4 = array.read %2[%arg2, %arg3, %arg4] : <5,5,8 x !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2,2 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<2,2 x !felt.type<"babybear">>]>, !array.type<2,2 x !felt.type<"babybear">> + function.call @matElemSum_5::@matElemSum_5::@constrain(%3, %5) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<2,2 x !felt.type<"babybear">>) -> () + } + } + } + function.return + } + } + } + poly.template @AveragePooling2D_12 { + struct.def @AveragePooling2D_12 { + struct.member @out : !array.type<5,5,8 x !felt.type<"babybear">> {llzk.pub} + struct.member @sumPooling2D : !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + struct.member @sumPooling2D$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c5 = arith.constant 5 : index + %c8 = arith.constant 8 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_25 = felt.const 25 : <"babybear"> + %c968 = arith.constant 968 : index + %self = struct.new : <@AveragePooling2D_12::@AveragePooling2D_12<[]>> + %nondet = llzk.nondet : !array.type<5,5,8 x !felt.type<"babybear">> + %pod = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c11 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c11 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %arg0[%4, %5, %6] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> + %9 = cast.toindex %1 : !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9, %10, %11] = %7 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %8 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.subi %12, %c1 : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.cmpi eq, %13, %c0 : index + scf.if %14 { + %15 = pod.read %pod_0[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> + %16 = function.call @SumPooling2D_11::@SumPooling2D_11::@compute(%15) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + } + } + } + } + scf.for %arg1 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c8 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + %5 = struct.readm %4[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %5[%6, %7, %8] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %1 : !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%11, %12, %13] = %10 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + struct.writem %self[@sumPooling2D$inputs] = %pod_0 : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + struct.writem %self[@sumPooling2D] = %0 : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + struct.writem %self[@out] = %nondet : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + function.return %self : !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, %arg1: !array.type<11,11,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c5 = arith.constant 5 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %c0 = arith.constant 0 : index + %felt_const_25 = felt.const 25 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@sumPooling2D] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>> + %2 = struct.readm %arg0[@sumPooling2D$inputs] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c11 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c11 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c8 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = cast.toindex %6 : !felt.type<"babybear"> + %10 = array.read %arg1[%7, %8, %9] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> + %12 = cast.toindex %4 : !felt.type<"babybear"> + %13 = cast.toindex %5 : !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = array.read %11[%12, %13, %14] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %15, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c8 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = struct.readm %1[@out] : <@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = cast.toindex %6 : !felt.type<"babybear"> + %11 = array.read %7[%8, %9, %10] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.mul %11, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = cast.toindex %6 : !felt.type<"babybear"> + %16 = array.read %0[%13, %14, %15] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + %3 = pod.read %2[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> + function.call @SumPooling2D_11::@SumPooling2D_11::@constrain(%1, %3) : (!struct.type<@SumPooling2D_11::@SumPooling2D_11<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Flatten2D_13 { + struct.def @Flatten2D_13 { + struct.member @out : !array.type<200 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4:2 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7:2 = scf.for %arg7 = %c0 to %c8 step %c1 iter_args(%arg8 = %arg5, %arg9 = %arg6) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%9, %10, %11] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %arg8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %arg8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%16, %17, %18] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %arg9 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%20] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %14, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %7#0, %7#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %4#0, %4#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> + } + function.def @compute(%arg0: !array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.for %arg3 = %c0 to %c5 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.for %arg5 = %c0 to %c8 step %c1 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%6, %7, %8] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %2 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, %arg1: !array.type<5,5,8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = scf.for %arg4 = %c0 to %c5 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = scf.for %arg6 = %c0 to %c8 step %c1 iter_args(%arg7 = %arg5) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%7, %8, %9] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %arg7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %5 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %3 : !felt.type<"babybear"> + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @matElemMul_14 { + struct.def @matElemMul_14 { + struct.member @out : !array.type<1,200 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>, %arg1: !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_14::@matElemMul_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_14::@matElemMul_14<[]>> + %nondet = llzk.nondet : !array.type<1,200 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c200 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_14::@matElemMul_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>, %arg2: !array.type<1,200 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c200 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_15 { + struct.def @matElemSum_15 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<200 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_15::@matElemSum_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c199 = arith.constant 199 : index + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_15::@matElemSum_15<[]>> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c200 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c199] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_15::@matElemSum_15<[]>>, !array.type<200 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_15::@matElemSum_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_15::@matElemSum_15<[]>>, !array.type<200 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c200 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c199] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_16 { + struct.def @matMul_16 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,200 x !felt.type<"babybear">>, %arg1: !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_16::@matMul_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c200 = arith.constant 200 : index + %c400 = arith.constant 400 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_16::@matMul_16<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c400 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c200 : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %16 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %32 = function.call @matElemMul_14::@matElemMul_14::@compute(%30, %31) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_14::@matElemMul_14<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + array.write %array[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %26 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %32 = function.call @matElemMul_14::@matElemMul_14::@compute(%30, %31) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_14::@matElemMul_14<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + array.write %array[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c200 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %19 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %24 = function.call @matElemSum_15::@matElemSum_15::@compute(%23) : (!array.type<1,200 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_15::@matElemSum_15<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + array.write %array_1[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemMulComp$inputs] = %array_0 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + %2 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_14::@matElemMul_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + struct.writem %self[@matElemMulComp] = %array_3 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + struct.writem %self[@matElemSumComp$inputs] = %array_2 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + %4 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_15::@matElemSum_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + struct.writem %self[@matElemSumComp] = %array_4 : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_16::@matMul_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_16::@matMul_16<[]>>, %arg1: !array.type<1,200 x !felt.type<"babybear">>, %arg2: !array.type<200,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c200 = arith.constant 200 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemMulComp] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>> + %2 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemSumComp] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>> + %4 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c200 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c200 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_15::@matElemSum_15<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemMul_14::@matElemMul_14<[]>>>, !struct.type<@matElemMul_14::@matElemMul_14<[]>> + %6 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + function.call @matElemMul_14::@matElemMul_14::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_14::@matElemMul_14<[]>>, !array.type<1,200 x !felt.type<"babybear">>, !array.type<1,200 x !felt.type<"babybear">>) -> () + %9 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemSum_15::@matElemSum_15<[]>>>, !struct.type<@matElemSum_15::@matElemSum_15<[]>> + %10 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>]> + %11 = pod.read %10[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + function.call @matElemSum_15::@matElemSum_15::@constrain(%9, %11) : (!struct.type<@matElemSum_15::@matElemSum_15<[]>>, !array.type<1,200 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_17 { + struct.def @Dense_17 { + struct.member @out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<10 x !struct.type<@matMul_16::@matMul_16<[]>>> + struct.member @dot$inputs : !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<200 x !felt.type<"babybear">>, %arg1: !array.type<200,10 x !felt.type<"babybear">>, %arg2: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c200 = arith.constant 200 : index + %c400 = arith.constant 400 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %self = struct.new : <@Dense_17::@Dense_17<[]>> + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + %array = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c400 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3] = %0 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c200 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %arg0[%11] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %15 = pod.read %14[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %16 = cast.toindex %10 : !felt.type<"babybear"> + array.write %15[%c0, %16] = %12 : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %array_0[%17] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + pod.write %18[@a] = %15 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %19 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%19] = %18 : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = array.read %array[%20] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %40 = pod.read %18[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %41 = pod.read %18[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %42 = function.call @matMul_16::@matMul_16::@compute(%40, %41) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_16::@matMul_16<[]>> + pod.write %21[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %21 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + } + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = array.read %arg1[%25, %26] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %30 = pod.read %29[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %31 = cast.toindex %10 : !felt.type<"babybear"> + array.write %30[%31, %c0] = %27 : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + %33 = array.read %array_0[%32] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + pod.write %33[@b] = %30 : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %34 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%34] = %33 : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %35 = cast.toindex %0 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %41 = pod.read %33[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %42 = function.call @matMul_16::@matMul_16::@compute(%40, %41) : (!array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_16::@matMul_16<[]>> + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %36 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + } + } + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + %4 = struct.readm %3[@out] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %5 = array.read %4[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %arg2[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <10 x !struct.type<@matMul_16::@matMul_16<[]>>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_16::@matMul_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_16::@matMul_16<[]>> + array.write %array_1[%arg3] = %1 : <10 x !struct.type<@matMul_16::@matMul_16<[]>>>, !struct.type<@matMul_16::@matMul_16<[]>> + } + struct.writem %self[@dot] = %array_1 : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !struct.type<@matMul_16::@matMul_16<[]>>> + struct.writem %self[@out] = %nondet : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> + function.return %self : !struct.type<@Dense_17::@Dense_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_17::@Dense_17<[]>>, %arg1: !array.type<200 x !felt.type<"babybear">>, %arg2: !array.type<200,10 x !felt.type<"babybear">>, %arg3: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c200 = arith.constant 200 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %0 = struct.readm %arg0[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@dot] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !struct.type<@matMul_16::@matMul_16<[]>>> + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c200 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = array.read %arg1[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %19 = cast.toindex %13 : !felt.type<"babybear"> + %20 = array.read %18[%c0, %19] : <1,200 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %13 : !felt.type<"babybear"> + %22 = cast.toindex %3 : !felt.type<"babybear"> + %23 = array.read %arg2[%21, %22] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %3 : !felt.type<"babybear"> + %25 = array.read %2[%24] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %26 = pod.read %25[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + %27 = cast.toindex %13 : !felt.type<"babybear"> + %28 = array.read %26[%27, %c0] : <200,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <10 x !struct.type<@matMul_16::@matMul_16<[]>>>, !struct.type<@matMul_16::@matMul_16<[]>> + %6 = struct.readm %5[@out] : <@matMul_16::@matMul_16<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg3[%8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %0[%11] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = array.read %1[%arg4] : <10 x !struct.type<@matMul_16::@matMul_16<[]>>>, !struct.type<@matMul_16::@matMul_16<[]>> + %4 = array.read %2[%arg4] : <10 x !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<1,200 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<1,200 x !felt.type<"babybear">>, @b: !array.type<200,1 x !felt.type<"babybear">>]>, !array.type<200,1 x !felt.type<"babybear">> + function.call @matMul_16::@matMul_16::@constrain(%3, %5, %6) : (!struct.type<@matMul_16::@matMul_16<[]>>, !array.type<1,200 x !felt.type<"babybear">>, !array.type<200,1 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @Num2Bits_18 { + struct.def @Num2Bits_18 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_19 { + struct.def @LessThan_19 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_18::@Num2Bits_18::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> + %26 = function.call @Num2Bits_18::@Num2Bits_18::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_18::@Num2Bits_18::@constrain(%13, %23) : (!struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_19::@LessThan_19<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_18::@Num2Bits_18::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_19::@LessThan_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_19::@LessThan_19<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_19::@LessThan_19<[]>>, !struct.type<@Num2Bits_18::@Num2Bits_18<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_19::@LessThan_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_18::@Num2Bits_18<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_18::@Num2Bits_18::@constrain(%1, %11) : (!struct.type<@Num2Bits_18::@Num2Bits_18<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_20 { + struct.def @GreaterThan_20 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_19::@LessThan_19<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_19::@LessThan_19::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> + %26 = function.call @LessThan_19::@LessThan_19::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_19::@LessThan_19::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_19::@LessThan_19::@constrain(%14, %23) : (!struct.type<@LessThan_19::@LessThan_19<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_19::@LessThan_19::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_19::@LessThan_19::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_19::@LessThan_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_20::@GreaterThan_20<[]>>, !struct.type<@LessThan_19::@LessThan_19<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_20::@GreaterThan_20<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_19::@LessThan_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_19::@LessThan_19::@constrain(%1, %10) : (!struct.type<@LessThan_19::@LessThan_19<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_21 { + struct.def @Switcher_21 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_21::@Switcher_21<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_21::@Switcher_21<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_21::@Switcher_21<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ArgMax_22 { + struct.def @ArgMax_22 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<11 x !felt.type<"babybear">> + struct.member @amaxs : !array.type<11 x !felt.type<"babybear">> + struct.member @switchers : !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> + struct.member @switchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @gts : !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> + struct.member @gts$inputs : !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @aswitchers : !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> + struct.member @aswitchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %15 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c1] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %136 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_20::@GreaterThan_20::@product(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> + %138 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %25[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %139 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%139] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg0[%29] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_3[%31] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c0] = %30 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%34] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@in] = %33 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%36] = %35 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_2[%37] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %136 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %38[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %138 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%138] = %38 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_2[%42] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_1[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@sel] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %136 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %53[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %nondet[%57] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_1[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@L] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %136 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %66[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %arg0[%70] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_1[%73] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %74[@R] = %71 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%76] = %74 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %77 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + %79 = array.read %array[%78] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %81 = arith.subi %80, %c1 {product_source = "compute"} : index + pod.write %79[@count] = %81 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %82 = arith.cmpi eq, %81, %c0 {product_source = "compute"} : index + scf.if %82 { + %136 = pod.read %74[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %74[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %74[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %79[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %79 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %83 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array_2[%83] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_5[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@sel] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_4[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %136 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %94[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %nondet_0[%98] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_5[%101] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %102[@L] = %99 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %103 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%104] = %102 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %105 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + %107 = array.read %array_4[%106] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %108 = pod.read %107[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %109 = arith.subi %108, %c1 {product_source = "compute"} : index + pod.write %107[@count] = %109 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %110 = arith.cmpi eq, %109, %c0 {product_source = "compute"} : index + scf.if %110 { + %136 = pod.read %102[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %102[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %102[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %107[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %107 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %111 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + %113 = array.read %array_5[%112] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %113[@R] = %15 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%115] = %113 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %116 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array_4[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %120 = arith.subi %119, %c1 {product_source = "compute"} : index + pod.write %118[@count] = %120 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %121 = arith.cmpi eq, %120, %c0 {product_source = "compute"} : index + scf.if %121 { + %136 = pod.read %113[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %113[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %113[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_21::@Switcher_21::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %118[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %118 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %122 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %122 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %array_4[%123] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %125 = pod.read %124[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %126 = struct.readm %125[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %127 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%128] = %126 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %129 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "compute"} + %131 = array.read %array[%130] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %132 = pod.read %131[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %133 = struct.readm %132[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %134 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %135 = cast.toindex %134 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%135] = %133 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet_0[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_1 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %16 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_3 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %16 : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_7 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_5 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %16 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_8 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet_0 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@amaxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@switchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@switchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %self[@gts] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "constrain"} + %8 = struct.readm %self[@gts$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %9 = struct.readm %self[@aswitchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %10 = struct.readm %self[@aswitchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %11 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %3[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %4[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %3[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %8[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg0[%22] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %8[%24] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %26[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %7[%28] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %6[%32] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %3[%35] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %6[%38] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %arg0[%41] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %6[%44] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %7[%47] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %49 = struct.readm %48[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %10[%51] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %4[%54] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %10[%57] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %59 = pod.read %58[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %10[%61] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %63 = pod.read %62[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %9[%65] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %67 = struct.readm %66[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %4[%69] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %70, %67 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %5[%72] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %74 = struct.readm %73[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %3[%76] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = array.read %4[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %5[%arg1] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %16 = array.read %6[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %7[%arg1] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %16 = array.read %8[%arg1] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_20::@GreaterThan_20::@constrain(%15, %17) : (!struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %9[%arg1] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %16 = array.read %10[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@ArgMax_22::@ArgMax_22<[]>> + } + function.def @compute(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %2 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_3[%5] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_3[%8] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%10] = %9 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_2[%11] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %123 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %12[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%125] = %12 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %123 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_20::@GreaterThan_20::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + pod.write %25[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%125] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_2[%29] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_1[%34] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%37] = %35 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %123 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %40[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %40 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_1[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %123 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %53[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_1[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %123 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %66[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_2[%70] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %72 = pod.read %71[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_5[%75] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %76[@sel] = %73 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%78] = %76 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %79 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_4[%80] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %81[@count] = %83 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %123 = pod.read %76[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %76[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %76[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %81[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %81 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %85 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %nondet_0[%85] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_5[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@L] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_4[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %123 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %94[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %array_5[%99] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %100[@R] = %2 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%102] = %100 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %103 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array_4[%104] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %123 = pod.read %100[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %100[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %100[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_21::@Switcher_21::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + pod.write %105[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %105 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %109 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %109 : !felt.type<"babybear"> {product_source = "compute"} + %111 = array.read %array_4[%110] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %112 = pod.read %111[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %113 = struct.readm %112[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%115] = %113 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %116 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + %120 = struct.readm %119[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %121 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %121 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%122] = %120 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet_0[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_1 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %3 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_3 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_7 = array.new : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %3 : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_7 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_5 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_21::@Switcher_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %3 : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_8 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet_0 : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ArgMax_22::@ArgMax_22<[]>> + } + function.def @constrain(%arg0: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, %arg1: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant {product_source = "constrain"} 10 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@amaxs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@switchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@switchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@gts] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@gts$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@aswitchers] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !struct.type<@Switcher_21::@Switcher_21<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@aswitchers$inputs] : <@ArgMax_22::@ArgMax_22<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = array.read %arg1[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %2[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %1[%14] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %6[%16] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%20] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %6[%22] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %5[%26] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %4[%30] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %1[%33] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %4[%36] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg1[%39] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %4[%42] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@GreaterThan_20::@GreaterThan_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %8[%49] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %2[%52] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %8[%55] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %8[%59] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %61 = pod.read %60[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %7[%63] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %65 = struct.readm %64[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %2[%67] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %3[%70] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@outL] : <@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %1[%74] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %75, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %2[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %3[%arg2] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %14 = array.read %4[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = array.read %5[%arg2] : <10 x !struct.type<@GreaterThan_20::@GreaterThan_20<[]>>>, !struct.type<@GreaterThan_20::@GreaterThan_20<[]>> {product_source = "constrain"} + %14 = array.read %6[%arg2] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_20::@GreaterThan_20::@constrain(%13, %15) : (!struct.type<@GreaterThan_20::@GreaterThan_20<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %7[%arg2] : <11 x !struct.type<@Switcher_21::@Switcher_21<[]>>>, !struct.type<@Switcher_21::@Switcher_21<[]>> {product_source = "constrain"} + %14 = array.read %8[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_21::@Switcher_21::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_21::@Switcher_21<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Poly_23 { + struct.def @Poly_23 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_23::@Poly_23<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1000000 = felt.const 1000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_23::@Poly_23<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg0, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Poly_23::@Poly_23<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_23::@Poly_23<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1000000 = felt.const 1000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_23::@Poly_23<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Poly_23::@Poly_23<[]>> + } + function.def @constrain(%arg0: !struct.type<@Poly_23::@Poly_23<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1000000 = felt.const 1000000 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.mul %arg1, %felt_const_1000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Poly_24 { + struct.def @Poly_24 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_24::@Poly_24<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1000000000000000000 = felt.const 1000000000000000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_24::@Poly_24<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg0, %felt_const_1000000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Poly_24::@Poly_24<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Poly_24::@Poly_24<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1000000000000000000 = felt.const 1000000000000000000 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Poly_24::@Poly_24<[]>> {product_source = "compute"} + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %arg0, %felt_const_1000000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Poly_24::@Poly_24<[]>> + } + function.def @constrain(%arg0: !struct.type<@Poly_24::@Poly_24<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1000000000000000000 = felt.const 1000000000000000000 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.mul %arg1, %felt_const_1000000000000000000 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @mnist_latest_25 { + struct.def @mnist_latest_25 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @dense_out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @argmax : !struct.type<@ArgMax_22::@ArgMax_22<[]>> + struct.member @argmax$inputs : !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> + struct.member @conv2d_2 : !struct.type<@Conv2D_9::@Conv2D_9<[]>> + struct.member @conv2d_2$inputs : !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> + struct.member @dense : !struct.type<@Dense_17::@Dense_17<[]>> + struct.member @dense$inputs : !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> + struct.member @conv2d_1 : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + struct.member @conv2d_1$inputs : !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> + struct.member @avg2d_2 : !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> + struct.member @avg2d_2$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> + struct.member @avg2d_1 : !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> + struct.member @avg2d_1$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> + struct.member @poly_1 : !array.type<26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> + struct.member @poly_1$inputs : !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @poly_2 : !array.type<11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> + struct.member @poly_2$inputs : !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @bn_1 : !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> + struct.member @bn_1$inputs : !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + struct.member @flatten : !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> + struct.member @flatten$inputs : !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> + struct.member @bn_2 : !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> + struct.member @bn_2$inputs : !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>, %arg5: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg6: !array.type<8 x !felt.type<"babybear">>, %arg7: !array.type<8 x !felt.type<"babybear">>, %arg8: !array.type<8 x !felt.type<"babybear">>, %arg9: !array.type<200,10 x !felt.type<"babybear">>, %arg10: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_latest_25::@mnist_latest_25<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c984 = arith.constant {product_source = "compute"} 984 : index + %c200 = arith.constant {product_source = "compute"} 200 : index + %c2712 = arith.constant {product_source = "compute"} 2712 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %c968 = arith.constant {product_source = "compute"} 968 : index + %c824 = arith.constant {product_source = "compute"} 824 : index + %c2210 = arith.constant {product_source = "compute"} 2210 : index + %c972 = arith.constant {product_source = "compute"} 972 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %self = struct.new : <@mnist_latest_25::@mnist_latest_25<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c972 } : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c2210 } : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c824 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %55 = array.read %array[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %55[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg11, %arg12, %arg13] = %55 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_11 = array.new : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %55 = array.read %array_12[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %55[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_12[%arg11, %arg12, %arg13] = %55 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_13 = array.new : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_14 = pod.new { @count = %c2712 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_15 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_16 = pod.new { @count = %c200 } : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_17 = pod.new : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_18 = pod.new { @count = %c984 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_19 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg11 = %c0 to %c28 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %arg0[%57, %58, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + array.write %60[%61, %62, %c0] = %59 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %60 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %63 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.subi %63, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %64 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.cmpi eq, %64, %c0 {product_source = "compute"} : index + scf.if %65 { + %66 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %69 = function.call @Conv2D_3::@Conv2D_3::@compute(%66, %67, %68) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %69 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %63 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %64 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %arg1[%65, %66, %c0, %67] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %70 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %69[%70, %71, %c0, %72] = %68 : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@weights] = %69 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %74 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = function.call @Conv2D_3::@Conv2D_3::@compute(%76, %77, %78) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %79 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg2[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@bias] = %58 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %61 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Conv2D_3::@Conv2D_3::@compute(%63, %64, %65) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %66 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg3[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@a] = %58 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %61 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %70 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%70, %71, %72) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %arg4[%63] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %65[%66] = %64 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@b] = %65 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %68 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %70 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%70, %71, %72) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %70 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %71 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %74 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %73[%74, %75, %76] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79, %80, %81] = %77 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@in] = %78 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %82 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %83 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %85 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %87 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %88 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%85, %86, %87) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %88 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_11[%64, %65, %66] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %67[@in] = %63 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_11[%68, %69, %70] = %67 : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array[%71, %72, %73] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %75 = pod.read %74[@count] : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.subi %75, %c1 {product_source = "compute"} : index + pod.write %74[@count] = %76 : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.cmpi eq, %76, %c0 {product_source = "compute"} : index + scf.if %77 { + %91 = pod.read %67[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %92 = function.call @Poly_23::@Poly_23::@product(%91) : (!felt.type<"babybear">) -> !struct.type<@Poly_23::@Poly_23<[]>> + %93 = function.call @Poly_23::@Poly_23::@compute(%91) : (!felt.type<"babybear">) -> !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + pod.write %74[@comp] = %92 : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + %94 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%94, %95, %96] = %74 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %78 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%78, %79, %80] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = pod.read %pod_10[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %85 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %84[%85, %86, %87] = %83 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@in] = %84 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %88 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %89 = arith.subi %88, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %89 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %90 = arith.cmpi eq, %89, %c0 {product_source = "compute"} : index + scf.if %90 { + %91 = pod.read %pod_10[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %92 = function.call @AveragePooling2D_7::@AveragePooling2D_7::@compute(%91) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %92 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c13 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %64[%65, %66, %67] = %63 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %64 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %69 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %74 = function.call @Conv2D_9::@Conv2D_9::@compute(%71, %72, %73) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %74 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %63 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %64 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %65 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg5[%66, %67, %68, %69] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %74 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72, %73, %74, %75] = %70 : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@weights] = %71 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %77 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %79 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %81 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = function.call @Conv2D_9::@Conv2D_9::@compute(%79, %80, %81) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %82 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg6[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@bias] = %58 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %61 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Conv2D_9::@Conv2D_9::@compute(%63, %64, %65) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %66 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg7[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_19[@a] = %58 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_18[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_18[@count] = %61 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %70 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%70, %71, %72) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_18[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %arg8[%63] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %65[%66] = %64 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_19[@b] = %65 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_18[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_18[@count] = %68 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %70 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %71 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%70, %71, %72) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_18[@comp] = %73 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %70 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %71 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %74 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %73[%74, %75, %76] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = cast.toindex %70 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %78[%79, %80, %81] = %77 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_19[@in] = %78 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = pod.read %pod_18[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %pod_18[@count] = %83 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %85 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %87 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%85, %86, %87) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_18[@comp] = %88 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_18[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_13[%64, %65, %66] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %67[@in] = %63 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_13[%68, %69, %70] = %67 : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_12[%71, %72, %73] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %75 = pod.read %74[@count] : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %76 = arith.subi %75, %c1 {product_source = "compute"} : index + pod.write %74[@count] = %76 : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.cmpi eq, %76, %c0 {product_source = "compute"} : index + scf.if %77 { + %91 = pod.read %67[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %92 = function.call @Poly_24::@Poly_24::@product(%91) : (!felt.type<"babybear">) -> !struct.type<@Poly_24::@Poly_24<[]>> + %93 = function.call @Poly_24::@Poly_24::@compute(%91) : (!felt.type<"babybear">) -> !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + pod.write %74[@comp] = %92 : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + %94 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %95 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %96 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_12[%94, %95, %96] = %74 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %78 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array_12[%78, %79, %80] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@comp] : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %85 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %86 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %84[%85, %86, %87] = %83 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %84 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %88 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %89 = arith.subi %88, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %89 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %90 = arith.cmpi eq, %89, %c0 {product_source = "compute"} : index + scf.if %90 { + %91 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %92 = function.call @AveragePooling2D_12::@AveragePooling2D_12::@compute(%91) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %92 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c5 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %59[%60, %61, %62] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %pod_17[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %64[%65, %66, %67] = %63 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_17[@in] = %64 : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_16[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %pod_16[@count] = %69 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %pod_17[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %72 = function.call @Flatten2D_13::@Flatten2D_13::@product(%71) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> + %73 = function.call @Flatten2D_13::@Flatten2D_13::@compute(%71) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + pod.write %pod_16[@comp] = %72 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c200 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + %57 = struct.readm %56[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %57[%58] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %60[%61] = %59 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %60 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %62 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %63 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %65 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %66 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %68 = function.call @Dense_17::@Dense_17::@compute(%65, %66, %67) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %68 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %65 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %67 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %arg9[%66, %67] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %70 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %71 = cast.toindex %65 : !felt.type<"babybear"> {product_source = "compute"} + array.write %69[%70, %71] = %68 : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@weights] = %69 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %73 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %75 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %78 = function.call @Dense_17::@Dense_17::@compute(%75, %76, %77) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %78 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %arg10[%56] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %58[%59] = %57 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@bias] = %58 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %60 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.subi %60, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %61 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.cmpi eq, %61, %c0 {product_source = "compute"} : index + scf.if %62 { + %63 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @Dense_17::@Dense_17::@compute(%63, %64, %65) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %66 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %57 = struct.readm %56[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %57[%58] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%60] = %59 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %62[%63] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %pod_0[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "compute"} + array.write %65[%66] = %64 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %65 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %68 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %70 = pod.read %pod_0[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %71 = function.call @ArgMax_22::@ArgMax_22::@product(%70) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> + %72 = function.call @ArgMax_22::@ArgMax_22::@compute(%70) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %71 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@mnist_latest_25::@mnist_latest_25<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@bn_2$inputs] = %pod_19 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_18[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@bn_2] = %2 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_4 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %3 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2$inputs] = %pod_2 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2] = %4 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1$inputs] = %pod_10 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1] = %5 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@bn_1$inputs] = %pod_15 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@bn_1] = %6 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1$inputs] = %pod_6 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1] = %7 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_0 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %8 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_2$inputs] = %pod_8 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_2] = %9 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@poly_1$inputs] = %array_11 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_20 = array.new : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %55 = array.read %array[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@comp] : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + array.write %array_20[%arg11, %arg12, %arg13] = %56 : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_1] = %array_20 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> {product_source = "compute"} + struct.writem %self[@poly_2$inputs] = %array_13 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_21 = array.new : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %55 = array.read %array_12[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@comp] : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + array.write %array_21[%arg11, %arg12, %arg13] = %56 : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_2] = %array_21 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_17 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %10 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %11 = struct.readm %self[@out] : <@mnist_latest_25::@mnist_latest_25<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %self[@dense_out] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = struct.readm %self[@argmax] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@argmax$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %self[@conv2d_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@conv2d_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %self[@dense] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@dense$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %self[@conv2d_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %20 = struct.readm %self[@conv2d_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %self[@avg2d_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "constrain"} + %22 = struct.readm %self[@avg2d_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %self[@avg2d_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "constrain"} + %24 = struct.readm %self[@avg2d_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %self[@poly_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> {product_source = "constrain"} + %26 = struct.readm %self[@poly_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %27 = struct.readm %self[@poly_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> {product_source = "constrain"} + %28 = struct.readm %self[@poly_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %29 = struct.readm %self[@bn_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "constrain"} + %30 = struct.readm %self[@bn_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %self[@flatten] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "constrain"} + %32 = struct.readm %self[@flatten$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %self[@bn_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "constrain"} + %34 = struct.readm %self[@bn_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg11 = %c0 to %c28 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %arg0[%57, %58, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %20[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %60[%61, %62, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %61 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %62 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %arg1[%63, %64, %c0, %65] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %67 = pod.read %20[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %67[%68, %69, %c0, %70] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %66 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg2[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %20[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg3[%56] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %30[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %arg4[%61] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %30[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %63[%64] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %66 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %67 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %68 = struct.readm %19[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = array.read %68[%69, %70, %71] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %30[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c26 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %29[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %26[%63, %64, %65] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %67 = pod.read %66[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %25[%68, %69, %70] : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@out] : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %24[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c13 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %23[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %16[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %63[%64, %65, %66] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %61 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %62 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %63 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %arg5[%64, %65, %66, %67] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %69 = pod.read %16[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %70 = cast.toindex %61 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %63 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %74 = array.read %69[%70, %71, %72, %73] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %74, %68 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg6[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %16[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg7[%56] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %34[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %arg8[%61] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %34[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %63[%64] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %66 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %67 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %68 = struct.readm %15[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %72 = array.read %68[%69, %70, %71] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %34[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c11 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %33[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %28[%63, %64, %65] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %67 = pod.read %66[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %27[%68, %69, %70] : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@out] : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %22[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %73[%74, %75, %76] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c5 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %56 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %21[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %58[%59, %60, %61] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = pod.read %32[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %64 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %63[%64, %65, %66] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c200 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = struct.readm %31[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %56[%57] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = pod.read %18[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %60 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %59[%60] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %62 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %arg9[%63, %64] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = pod.read %18[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %69 = array.read %66[%67, %68] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %69, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg10[%56] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %18[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %58[%59] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %55 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "constrain"} + %56 = struct.readm %17[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %56[%57] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %12[%59] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = struct.readm %17[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %62 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %61[%62] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %14[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %64[%65] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %35 = struct.readm %13[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = pod.read %34[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %34[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = pod.read %34[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@constrain(%33, %36, %37, %38) : (!struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %39 = pod.read %18[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = pod.read %18[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = pod.read %18[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_17::@Dense_17::@constrain(%17, %39, %40, %41) : (!struct.type<@Dense_17::@Dense_17<[]>>, !array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %42 = pod.read %16[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = pod.read %16[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = pod.read %16[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_9::@Conv2D_9::@constrain(%15, %42, %43, %44) : (!struct.type<@Conv2D_9::@Conv2D_9<[]>>, !array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %45 = pod.read %24[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_7::@AveragePooling2D_7::@constrain(%23, %45) : (!struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %46 = pod.read %30[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = pod.read %30[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = pod.read %30[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@constrain(%29, %46, %47, %48) : (!struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %49 = pod.read %20[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = pod.read %20[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = pod.read %20[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%19, %49, %50, %51) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %52 = pod.read %14[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_22::@ArgMax_22::@constrain(%13, %52) : (!struct.type<@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %53 = pod.read %22[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_12::@AveragePooling2D_12::@constrain(%21, %53) : (!struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %55 = array.read %25[%arg11, %arg12, %arg13] : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "constrain"} + %56 = array.read %26[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_23::@Poly_23::@constrain(%55, %57) : (!struct.type<@Poly_23::@Poly_23<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %55 = array.read %27[%arg11, %arg12, %arg13] : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "constrain"} + %56 = array.read %28[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_24::@Poly_24::@constrain(%55, %57) : (!struct.type<@Poly_24::@Poly_24<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %54 = pod.read %32[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_13::@Flatten2D_13::@constrain(%31, %54) : (!struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<5,5,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@mnist_latest_25::@mnist_latest_25<[]>> + } + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>, %arg5: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg6: !array.type<8 x !felt.type<"babybear">>, %arg7: !array.type<8 x !felt.type<"babybear">>, %arg8: !array.type<8 x !felt.type<"babybear">>, %arg9: !array.type<200,10 x !felt.type<"babybear">>, %arg10: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_latest_25::@mnist_latest_25<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c984 = arith.constant {product_source = "compute"} 984 : index + %c200 = arith.constant {product_source = "compute"} 200 : index + %c2712 = arith.constant {product_source = "compute"} 2712 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c26 = arith.constant {product_source = "compute"} 26 : index + %c2704 = arith.constant {product_source = "compute"} 2704 : index + %c968 = arith.constant {product_source = "compute"} 968 : index + %c824 = arith.constant {product_source = "compute"} 824 : index + %c2210 = arith.constant {product_source = "compute"} 2210 : index + %c972 = arith.constant {product_source = "compute"} 972 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %self = struct.new : <@mnist_latest_25::@mnist_latest_25<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c972 } : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c2210 } : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c824 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c968 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c2704 } : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %11 = array.read %array[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg11, %arg12, %arg13] = %11 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_11 = array.new : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %11 = array.read %array_12[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c1 : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_12[%arg11, %arg12, %arg13] = %11 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_13 = array.new : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_14 = pod.new { @count = %c2712 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_15 = pod.new : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_16 = pod.new { @count = %c200 } : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_17 = pod.new : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_18 = pod.new { @count = %c984 } : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_19 = pod.new : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg11 = %c0 to %c28 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%13, %14, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18, %c0] = %15 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %16 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %20 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @Conv2D_3::@Conv2D_3::@compute(%22, %23, %24) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %25 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %20 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg1[%21, %22, %c0, %23] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%26, %27, %c0, %28] = %24 : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@weights] = %25 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %30 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @Conv2D_3::@Conv2D_3::@compute(%32, %33, %34) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %35 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg2[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@bias] = %14 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_6[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_6[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_6[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Conv2D_3::@Conv2D_3::@compute(%19, %20, %21) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %22 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg3[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@a] = %14 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %17 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %26 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%26, %27, %28) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg4[%19] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@b] = %21 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %24 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%26, %27, %28) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %26 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %27 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %29[%30, %31, %32] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35, %36, %37] = %33 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_15[@in] = %34 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_14[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_14[@count] = %39 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_15[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_15[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %43 = pod.read %pod_15[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@compute(%41, %42, %43) : (!array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + pod.write %pod_14[@comp] = %44 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_11[%20, %21, %22] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@in] = %19 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_11[%24, %25, %26] = %23 : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array[%27, %28, %29] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@count] : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %30[@count] = %32 : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %47 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = function.call @Poly_23::@Poly_23::@compute(%47) : (!felt.type<"babybear">) -> !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + pod.write %30[@comp] = %48 : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + %49 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50, %51] = %30 : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%34, %35, %36] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_10[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41, %42, %43] = %39 : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@in] = %40 : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %45 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_10[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @AveragePooling2D_7::@AveragePooling2D_7::@compute(%47) : (!array.type<26,26,4 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %48 : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c13 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c4 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21, %22, %23] = %19 : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %20 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %25 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Conv2D_9::@Conv2D_9::@compute(%27, %28, %29) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %30 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c3 step %c1 { + %19 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %20 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %21 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg5[%22, %23, %24, %25] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28, %29, %30, %31] = %26 : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@weights] = %27 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %33 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %35 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @Conv2D_9::@Conv2D_9::@compute(%35, %36, %37) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %38 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg6[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@bias] = %14 : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %17 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_2[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_2[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_2[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Conv2D_9::@Conv2D_9::@compute(%19, %20, %21) : (!array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c8 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg7[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_19[@a] = %14 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_18[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_18[@count] = %17 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %26 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%26, %27, %28) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_18[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg8[%19] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_19[@b] = %21 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_18[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_18[@count] = %24 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%26, %27, %28) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_18[@comp] = %29 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %26 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %27 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %29[%30, %31, %32] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35, %36, %37] = %33 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_19[@in] = %34 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_18[@count] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_18[@count] = %39 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_19[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_19[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %43 = pod.read %pod_19[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %44 = function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@compute(%41, %42, %43) : (!array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + pod.write %pod_18[@comp] = %44 : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_18[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_13[%20, %21, %22] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@in] = %19 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_13[%24, %25, %26] = %23 : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_12[%27, %28, %29] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@count] : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %30[@count] = %32 : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %47 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = function.call @Poly_24::@Poly_24::@compute(%47) : (!felt.type<"babybear">) -> !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + pod.write %30[@comp] = %48 : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + %49 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_12[%49, %50, %51] = %30 : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_12[%34, %35, %36] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41, %42, %43] = %39 : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %40 : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %45 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_8[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @AveragePooling2D_12::@AveragePooling2D_12::@compute(%47) : (!array.type<11,11,8 x !felt.type<"babybear">>) -> !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %48 : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c5 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %12 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg13 = %c0 to %c8 step %c1 { + %13 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %15[%16, %17, %18] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_17[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21, %22, %23] = %19 : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_17[@in] = %20 : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_16[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_16[@count] = %25 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_17[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @Flatten2D_13::@Flatten2D_13::@compute(%27) : (!array.type<5,5,8 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + pod.write %pod_16[@comp] = %28 : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c200 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17] = %15 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %16 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %19 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %21 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @Dense_17::@Dense_17::@compute(%21, %22, %23) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %21 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg9[%22, %23] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%26, %27] = %24 : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@weights] = %25 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %29 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %31 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Dense_17::@Dense_17::@compute(%31, %32, %33) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %34 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg10[%12] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@bias] = %14 : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %17 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_4[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_4[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_4[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Dense_17::@Dense_17::@compute(%19, %20, %21) : (!array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg11 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg11 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %18[%19] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_0[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %21 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %24 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @ArgMax_22::@ArgMax_22::@compute(%26) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@mnist_latest_25::@mnist_latest_25<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@bn_2$inputs] = %pod_19 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_18[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@bn_2] = %2 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_4 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Dense_17::@Dense_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %3 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2$inputs] = %pod_2 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_9::@Conv2D_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_2] = %4 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1$inputs] = %pod_10 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_1] = %5 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "compute"} + struct.writem %self[@bn_1$inputs] = %pod_15 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_14[@comp] : <[@count: index, @comp: !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@bn_1] = %6 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1$inputs] = %pod_6 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d_1] = %7 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_0 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_22::@ArgMax_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %8 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_2$inputs] = %pod_8 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@avg2d_2] = %9 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "compute"} + struct.writem %self[@poly_1$inputs] = %array_11 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_20 = array.new : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c26 step %c1 { + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c4 step %c1 { + %11 = array.read %array[%arg11, %arg12, %arg13] : <26,26,4 x !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Poly_23::@Poly_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + array.write %array_20[%arg11, %arg12, %arg13] = %12 : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_1] = %array_20 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> {product_source = "compute"} + struct.writem %self[@poly_2$inputs] = %array_13 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_21 = array.new : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> {product_source = "compute"} + scf.for %arg11 = %c0 to %c11 step %c1 { + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c8 step %c1 { + %11 = array.read %array_12[%arg11, %arg12, %arg13] : <11,11,8 x !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@Poly_24::@Poly_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + array.write %array_21[%arg11, %arg12, %arg13] = %12 : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@poly_2] = %array_21 : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_17 : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_16[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %10 : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@mnist_latest_25::@mnist_latest_25<[]>> + } + function.def @constrain(%arg0: !struct.type<@mnist_latest_25::@mnist_latest_25<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,4 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>, %arg5: !array.type<4 x !felt.type<"babybear">>, %arg6: !array.type<3,3,4,8 x !felt.type<"babybear">>, %arg7: !array.type<8 x !felt.type<"babybear">>, %arg8: !array.type<8 x !felt.type<"babybear">>, %arg9: !array.type<8 x !felt.type<"babybear">>, %arg10: !array.type<200,10 x !felt.type<"babybear">>, %arg11: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant 10 : index + %c200 = arith.constant 200 : index + %c5 = arith.constant 5 : index + %c13 = arith.constant 13 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c8 = arith.constant {product_source = "constrain"} 8 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %c26 = arith.constant {product_source = "constrain"} 26 : index + %0 = struct.readm %arg0[@out] : <@mnist_latest_25::@mnist_latest_25<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@dense_out] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@argmax] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@ArgMax_22::@ArgMax_22<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@argmax$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@conv2d_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_9::@Conv2D_9<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@conv2d_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@dense] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Dense_17::@Dense_17<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@dense$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %arg0[@conv2d_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@conv2d_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = struct.readm %arg0[@avg2d_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>> {product_source = "constrain"} + %11 = struct.readm %arg0[@avg2d_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = struct.readm %arg0[@avg2d_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>> {product_source = "constrain"} + %13 = struct.readm %arg0[@avg2d_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = struct.readm %arg0[@poly_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>> {product_source = "constrain"} + %15 = struct.readm %arg0[@poly_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@poly_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>> {product_source = "constrain"} + %17 = struct.readm %arg0[@poly_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !array.type<11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@bn_1] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>> {product_source = "constrain"} + %19 = struct.readm %arg0[@bn_1$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = struct.readm %arg0[@flatten] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@Flatten2D_13::@Flatten2D_13<[]>> {product_source = "constrain"} + %21 = struct.readm %arg0[@flatten$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<5,5,8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = struct.readm %arg0[@bn_2] : <@mnist_latest_25::@mnist_latest_25<[]>>, !struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>> {product_source = "constrain"} + %23 = struct.readm %arg0[@bn_2$inputs] : <@mnist_latest_25::@mnist_latest_25<[]>>, !pod.type<[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg12 = %c0 to %c28 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c28 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %arg1[%46, %47, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = pod.read %9[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %49[%50, %51, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c4 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %50 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c3 step %c1 { + %51 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %arg2[%52, %53, %c0, %54] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = pod.read %9[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %56[%57, %58, %c0, %59] : <3,3,1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %60, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg3[%45] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %9[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c4 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg4[%45] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %19[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %arg5[%50] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %19[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %55 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c26 step %c1 { + %56 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %57 = struct.readm %8[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %57[%58, %59, %60] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %19[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c26 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %18[@out] : <@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %15[%52, %53, %54] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %56 = pod.read %55[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %14[%57, %58, %59] : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "constrain"} + %61 = struct.readm %60[@out] : <@Poly_23::@Poly_23<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %13[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <26,26,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c13 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c13 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c4 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %12[@out] : <@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %5[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %52[%53, %54, %55] : <13,13,4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c3 step %c1 { + %50 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c3 step %c1 { + %51 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg15 = %c0 to %c4 step %c1 { + %52 = cast.tofelt %arg15 : index, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = array.read %arg6[%53, %54, %55, %56] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %5[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %58[%59, %60, %61, %62] : <3,3,4,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg7[%45] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %5[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c8 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg8[%45] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %23[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %arg9[%50] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %23[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %55 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c11 step %c1 { + %56 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %57 = struct.readm %4[@out] : <@Conv2D_9::@Conv2D_9<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %58 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %57[%58, %59, %60] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %23[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %55 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c11 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c8 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %22[@out] : <@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %17[%52, %53, %54] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %56 = pod.read %55[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %16[%57, %58, %59] : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "constrain"} + %61 = struct.readm %60[@out] : <@Poly_24::@Poly_24<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %11[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %62[%63, %64, %65] : <11,11,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %66, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c5 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c5 step %c1 { + %45 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg14 = %c0 to %c8 step %c1 { + %46 = cast.tofelt %arg14 : index, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %10[@out] : <@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %47[%48, %49, %50] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %21[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %45 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %52[%53, %54, %55] : <5,5,8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c200 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = struct.readm %20[@out] : <@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = pod.read %7[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %48[%49] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg13 = %c0 to %c10 step %c1 { + %51 = cast.tofelt %arg13 : index, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %arg10[%52, %53] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = pod.read %7[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %55[%56, %57] : <200,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %58, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg11[%45] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %7[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %47[%48] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c10 step %c1 { + %44 = cast.tofelt %arg12 : index, !felt.type<"babybear"> {product_source = "constrain"} + %45 = struct.readm %6[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %1[%48] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = struct.readm %6[@out] : <@Dense_17::@Dense_17<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = pod.read %3[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %54 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %53[%54] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %24 = struct.readm %2[@out] : <@ArgMax_22::@ArgMax_22<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %23[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = pod.read %23[@a] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = pod.read %23[@b] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>, @a: !array.type<8 x !felt.type<"babybear">>, @b: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_10::@BatchNormalization2D_10::@constrain(%22, %25, %26, %27) : (!struct.type<@BatchNormalization2D_10::@BatchNormalization2D_10<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %28 = pod.read %7[@in] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = pod.read %7[@weights] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<200,10 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = pod.read %7[@bias] : <[@in: !array.type<200 x !felt.type<"babybear">>, @weights: !array.type<200,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_17::@Dense_17::@constrain(%6, %28, %29, %30) : (!struct.type<@Dense_17::@Dense_17<[]>>, !array.type<200 x !felt.type<"babybear">>, !array.type<200,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %31 = pod.read %5[@in] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<13,13,4 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = pod.read %5[@weights] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<3,3,4,8 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = pod.read %5[@bias] : <[@in: !array.type<13,13,4 x !felt.type<"babybear">>, @weights: !array.type<3,3,4,8 x !felt.type<"babybear">>, @bias: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_9::@Conv2D_9::@constrain(%4, %31, %32, %33) : (!struct.type<@Conv2D_9::@Conv2D_9<[]>>, !array.type<13,13,4 x !felt.type<"babybear">>, !array.type<3,3,4,8 x !felt.type<"babybear">>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %34 = pod.read %13[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_7::@AveragePooling2D_7::@constrain(%12, %34) : (!struct.type<@AveragePooling2D_7::@AveragePooling2D_7<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %35 = pod.read %19[@in] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<26,26,4 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = pod.read %19[@a] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %19[@b] : <[@in: !array.type<26,26,4 x !felt.type<"babybear">>, @a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BatchNormalization2D_4::@BatchNormalization2D_4::@constrain(%18, %35, %36, %37) : (!struct.type<@BatchNormalization2D_4::@BatchNormalization2D_4<[]>>, !array.type<26,26,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %38 = pod.read %9[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = pod.read %9[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3,3,1,4 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = pod.read %9[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,4 x !felt.type<"babybear">>, @bias: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%8, %38, %39, %40) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %41 = pod.read %3[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_22::@ArgMax_22::@constrain(%2, %41) : (!struct.type<@ArgMax_22::@ArgMax_22<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %42 = pod.read %11[@in] : <[@in: !array.type<11,11,8 x !felt.type<"babybear">>]>, !array.type<11,11,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AveragePooling2D_12::@AveragePooling2D_12::@constrain(%10, %42) : (!struct.type<@AveragePooling2D_12::@AveragePooling2D_12<[]>>, !array.type<11,11,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg12 = %c0 to %c26 step %c1 { + scf.for %arg13 = %c0 to %c26 step %c1 { + scf.for %arg14 = %c0 to %c4 step %c1 { + %44 = array.read %14[%arg12, %arg13, %arg14] : <26,26,4 x !struct.type<@Poly_23::@Poly_23<[]>>>, !struct.type<@Poly_23::@Poly_23<[]>> {product_source = "constrain"} + %45 = array.read %15[%arg12, %arg13, %arg14] : <26,26,4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_23::@Poly_23::@constrain(%44, %46) : (!struct.type<@Poly_23::@Poly_23<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg12 = %c0 to %c11 step %c1 { + scf.for %arg13 = %c0 to %c11 step %c1 { + scf.for %arg14 = %c0 to %c8 step %c1 { + %44 = array.read %16[%arg12, %arg13, %arg14] : <11,11,8 x !struct.type<@Poly_24::@Poly_24<[]>>>, !struct.type<@Poly_24::@Poly_24<[]>> {product_source = "constrain"} + %45 = array.read %17[%arg12, %arg13, %arg14] : <11,11,8 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Poly_24::@Poly_24::@constrain(%44, %46) : (!struct.type<@Poly_24::@Poly_24<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %43 = pod.read %21[@in] : <[@in: !array.type<5,5,8 x !felt.type<"babybear">>]>, !array.type<5,5,8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_13::@Flatten2D_13::@constrain(%20, %43) : (!struct.type<@Flatten2D_13::@Flatten2D_13<[]>>, !array.type<5,5,8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mnist_test.llzk b/examples/circom-demo/mnist_test.llzk new file mode 100644 index 0000000..bdbbb47 --- /dev/null +++ b/examples/circom-demo/mnist_test.llzk @@ -0,0 +1,3726 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@mnist_20::@mnist_20<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<3,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg0[%2, %3] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%5, %6] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10] = %8 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>, %arg2: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = cast.toindex %2 : !felt.type<"babybear"> + %5 = array.read %arg1[%3, %4] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + %8 = array.read %arg2[%6, %7] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = cast.toindex %2 : !felt.type<"babybear"> + %12 = array.read %0[%10, %11] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<9 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<9 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %6 { + %8 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %nondet[%9] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %arg0[%11, %12] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %arg4 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + scf.yield %4 : !felt.type<"babybear"> + } + %2 = array.read %nondet[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<9 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %7 = scf.for %arg4 = %c0 to %c3 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp gt(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %9 { + %11 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %6 : !felt.type<"babybear"> + %15 = cast.toindex %8 : !felt.type<"babybear"> + %16 = array.read %arg1[%14, %15] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %arg5 : !felt.type<"babybear"> + %19 = array.read %1[%18] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %10 : !felt.type<"babybear"> + } + scf.yield %7 : !felt.type<"babybear"> + } + %5 = array.read %1[%c8] : <9 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Sum_2 { + struct.def @Sum_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @partialSum : !array.type<1 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %self = struct.new : <@Sum_2::@Sum_2<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@partialSum] = %nondet : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Sum_2::@Sum_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sum_2::@Sum_2<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@partialSum] : <@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Conv2D_3 { + struct.def @Conv2D_3 { + struct.member @out : !array.type<26,26,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @sum : !array.type<26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.member @sum$inputs : !array.type<26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + struct.member @mul : !array.type<26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @mul$inputs : !array.type<26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + struct.member @elemSum : !array.type<26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @elemSum$inputs : !array.type<26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,1 x !felt.type<"babybear">>, %arg2: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c9 = arith.constant 9 : index + %c18 = arith.constant 18 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %self = struct.new : <@Conv2D_3::@Conv2D_3<[]>> + %nondet = llzk.nondet : !array.type<26,26,1 x !felt.type<"babybear">> + %array = array.new : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0] : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3, %arg4, %c0] = %0 : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + } + %array_0 = array.new : <26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg3, %arg4, %c0, %c0] = %0 : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + %array_2 = array.new : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c9 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg3, %arg4, %c0, %c0] = %0 : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + %array_4 = array.new : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c26 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c26 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + scf.for %arg5 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %4 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %7, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg0[%6, %9, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %array_2[%11, %12, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %14 = pod.read %13[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %15 = cast.toindex %2 : !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %14[%15, %16] = %10 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = cast.toindex %1 : !felt.type<"babybear"> + %19 = array.read %array_2[%17, %18, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %19[@a] = %14 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_2[%20, %21, %c0, %c0] = %19 : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + %24 = array.read %array_1[%22, %23, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %49 = pod.read %19[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %50 = function.call @matElemMul_0::@matElemMul_0::@compute(%48, %49) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %24[@comp] = %50 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_1[%51, %52, %c0, %c0] = %24 : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = cast.toindex %3 : !felt.type<"babybear"> + %30 = array.read %arg1[%28, %29, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %0 : !felt.type<"babybear"> + %32 = cast.toindex %1 : !felt.type<"babybear"> + %33 = array.read %array_2[%31, %32, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %34 = pod.read %33[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = cast.toindex %3 : !felt.type<"babybear"> + array.write %34[%35, %36] = %30 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = cast.toindex %0 : !felt.type<"babybear"> + %38 = cast.toindex %1 : !felt.type<"babybear"> + %39 = array.read %array_2[%37, %38, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %39[@b] = %34 : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %40 = cast.toindex %0 : !felt.type<"babybear"> + %41 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_2[%40, %41, %c0, %c0] = %39 : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %42 = cast.toindex %0 : !felt.type<"babybear"> + %43 = cast.toindex %1 : !felt.type<"babybear"> + %44 = array.read %array_1[%42, %43, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %46 = arith.subi %45, %c1 : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %47 = arith.cmpi eq, %46, %c0 : index + scf.if %47 { + %48 = pod.read %39[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %49 = pod.read %39[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %50 = function.call @matElemMul_0::@matElemMul_0::@compute(%48, %49) : (!array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %44[@comp] = %50 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %51 = cast.toindex %0 : !felt.type<"babybear"> + %52 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_1[%51, %52, %c0, %c0] = %44 : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.for %arg5 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.for %arg6 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %4 = cast.toindex %0 : !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %array_1[%4, %5, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = struct.readm %7[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = cast.toindex %3 : !felt.type<"babybear"> + %11 = array.read %8[%9, %10] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %array_4[%12, %13, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %15 = pod.read %14[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16, %17] = %11 : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %0 : !felt.type<"babybear"> + %19 = cast.toindex %1 : !felt.type<"babybear"> + %20 = array.read %array_4[%18, %19, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + pod.write %20[@a] = %15 : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %21 = cast.toindex %0 : !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_4[%21, %22, %c0, %c0] = %20 : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + %25 = array.read %array_3[%23, %24, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.subi %26, %c1 : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.cmpi eq, %27, %c0 : index + scf.if %28 { + %29 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %30 = function.call @matElemSum_1::@matElemSum_1::@compute(%29) : (!array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %25[@comp] = %30 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %31 = cast.toindex %0 : !felt.type<"babybear"> + %32 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_3[%31, %32, %c0, %c0] = %25 : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) + } do { + scf.while (%arg5 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %11 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%11) + } do { + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %array_3[%11, %12, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %14 = pod.read %13[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %15 = struct.readm %14[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = cast.toindex %1 : !felt.type<"babybear"> + %18 = array.read %array_0[%16, %17, %c0] : <26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %19 = pod.read %18[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + array.write %19[%c0] = %15 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + %22 = array.read %array_0[%20, %21, %c0] : <26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + pod.write %22[@in] = %19 : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %23 = cast.toindex %0 : !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array_0[%23, %24, %c0] = %22 : <26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = cast.toindex %1 : !felt.type<"babybear"> + %27 = array.read %array[%25, %26, %c0] : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %28 = pod.read %27[@count] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.subi %28, %c1 : index + pod.write %27[@count] = %29 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, index + %30 = arith.cmpi eq, %29, %c0 : index + scf.if %30 { + %31 = pod.read %22[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %32 = function.call @Sum_2::@Sum_2::@compute(%31) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Sum_2::@Sum_2<[]>> + pod.write %27[@comp] = %32 : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %33 = cast.toindex %0 : !felt.type<"babybear"> + %34 = cast.toindex %1 : !felt.type<"babybear"> + array.write %array[%33, %34, %c0] = %27 : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %2 = cast.toindex %0 : !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %array[%2, %3, %c0] : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + %6 = struct.readm %5[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%9, %10, %c0] = %8 : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + } + } + struct.writem %self[@sum$inputs] = %array_0 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %array_5 = array.new : <26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + %0 = array.read %array[%arg3, %arg4, %c0] : <26,26,1 x !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Sum_2::@Sum_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sum_2::@Sum_2<[]>> + array.write %array_5[%arg3, %arg4, %c0] = %1 : <26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + } + } + struct.writem %self[@sum] = %array_5 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>> + struct.writem %self[@mul$inputs] = %array_2 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_6 = array.new : <26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + %0 = array.read %array_1[%arg3, %arg4, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_6[%arg3, %arg4, %c0, %c0] = %1 : <26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + } + struct.writem %self[@mul] = %array_6 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@elemSum$inputs] = %array_4 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + %array_7 = array.new : <26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + scf.for %arg3 = %c0 to %c26 step %c1 { + scf.for %arg4 = %c0 to %c26 step %c1 { + %0 = array.read %array_3[%arg3, %arg4, %c0, %c0] : <26,26,1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_7[%arg3, %arg4, %c0, %c0] = %1 : <26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + } + struct.writem %self[@elemSum] = %array_7 : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@out] = %nondet : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,1 x !felt.type<"babybear">>, %arg3: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@sum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>> + %2 = struct.readm %arg0[@sum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@mul] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@mul$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@elemSum] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %6 = struct.readm %arg0[@elemSum$inputs] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c26 step %c1 { + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c26 step %c1 { + %8 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + scf.for %arg6 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %11 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = felt.mul %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%13, %16, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = array.read %4[%18, %19, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %22 = cast.toindex %9 : !felt.type<"babybear"> + %23 = cast.toindex %10 : !felt.type<"babybear"> + %24 = array.read %21[%22, %23] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %9 : !felt.type<"babybear"> + %26 = cast.toindex %10 : !felt.type<"babybear"> + %27 = array.read %arg2[%25, %26, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %7 : !felt.type<"babybear"> + %29 = cast.toindex %8 : !felt.type<"babybear"> + %30 = array.read %4[%28, %29, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %31 = pod.read %30[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %32 = cast.toindex %9 : !felt.type<"babybear"> + %33 = cast.toindex %10 : !felt.type<"babybear"> + %34 = array.read %31[%32, %33] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %34, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.for %arg6 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + scf.for %arg7 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg7 : index, !felt.type<"babybear"> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %3[%11, %12, %c0, %c0] : <26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %14 = struct.readm %13[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">> + %15 = cast.toindex %9 : !felt.type<"babybear"> + %16 = cast.toindex %10 : !felt.type<"babybear"> + %17 = array.read %14[%15, %16] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = array.read %6[%18, %19, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %22 = cast.toindex %9 : !felt.type<"babybear"> + %23 = cast.toindex %10 : !felt.type<"babybear"> + %24 = array.read %21[%22, %23] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %18 = bool.cmp lt(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%18) + } do { + %18 = cast.toindex %7 : !felt.type<"babybear"> + %19 = cast.toindex %8 : !felt.type<"babybear"> + %20 = array.read %5[%18, %19, %c0, %c0] : <26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %21 = struct.readm %20[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %22 = cast.toindex %7 : !felt.type<"babybear"> + %23 = cast.toindex %8 : !felt.type<"babybear"> + %24 = array.read %2[%22, %23, %c0] : <26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %25 = pod.read %24[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + %26 = array.read %25[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %9 = cast.toindex %7 : !felt.type<"babybear"> + %10 = cast.toindex %8 : !felt.type<"babybear"> + %11 = array.read %1[%9, %10, %c0] : <26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %12 = struct.readm %11[@out] : <@Sum_2::@Sum_2<[]>>, !felt.type<"babybear"> + %13 = array.read %arg3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %7 : !felt.type<"babybear"> + %16 = cast.toindex %8 : !felt.type<"babybear"> + %17 = array.read %0[%15, %16, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + %7 = array.read %1[%arg4, %arg5, %c0] : <26,26,1 x !struct.type<@Sum_2::@Sum_2<[]>>>, !struct.type<@Sum_2::@Sum_2<[]>> + %8 = array.read %2[%arg4, %arg5, %c0] : <26,26,1 x !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> + function.call @Sum_2::@Sum_2::@constrain(%7, %9) : (!struct.type<@Sum_2::@Sum_2<[]>>, !array.type<1 x !felt.type<"babybear">>) -> () + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + %7 = array.read %3[%arg4, %arg5, %c0, %c0] : <26,26,1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %8 = array.read %4[%arg4, %arg5, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + %10 = pod.read %8[@b] : <[@a: !array.type<3,3 x !felt.type<"babybear">>, @b: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%7, %9, %10) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<3,3 x !felt.type<"babybear">>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + scf.for %arg4 = %c0 to %c26 step %c1 { + scf.for %arg5 = %c0 to %c26 step %c1 { + %7 = array.read %5[%arg4, %arg5, %c0, %c0] : <26,26,1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = array.read %6[%arg4, %arg5, %c0, %c0] : <26,26,1,1 x !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<3,3 x !felt.type<"babybear">>]> + %9 = pod.read %8[@a] : <[@a: !array.type<3,3 x !felt.type<"babybear">>]>, !array.type<3,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%7, %9) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<3,3 x !felt.type<"babybear">>) -> () + } + } + function.return + } + } + } + poly.template @Flatten2D_4 { + struct.def @Flatten2D_4 { + struct.member @out : !array.type<676 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<26,26,1 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg1 = %c0 to %c26 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4:2 = scf.for %arg4 = %c0 to %c26 step %c1 iter_args(%arg5 = %arg2, %arg6 = %arg3) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = scf.while (%arg7 = %felt_const_0, %arg8 = %arg5) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %9 = bool.cmp lt(%arg7, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%9) %arg8 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%9, %10, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %arg7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%12] = %11 : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = scf.while (%arg7 = %arg6, %arg8 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %9 = bool.cmp lt(%arg8, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%9) %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%9, %10, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %arg7 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + scf.yield %4#0, %4#1 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> + } + function.def @compute(%arg0: !array.type<26,26,1 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c26 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.for %arg3 = %c0 to %c26 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = scf.while (%arg5 = %felt_const_0, %arg6 = %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %5 = bool.cmp lt(%arg5, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%5) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%5, %6, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %arg5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield {product_source = "compute"} %4 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %2 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, %arg1: !array.type<26,26,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c26 = arith.constant 26 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = scf.for %arg2 = %c0 to %c26 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = scf.for %arg4 = %c0 to %c26 step %c1 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = scf.while (%arg6 = %arg5, %arg7 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg7, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%6) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg1[%6, %7, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield {product_source = "constrain"} %5 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %3 : !felt.type<"babybear"> + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @matElemMul_5 { + struct.def @matElemMul_5 { + struct.member @out : !array.type<1,676 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,676 x !felt.type<"babybear">>, %arg1: !array.type<1,676 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_5::@matElemMul_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c676 = arith.constant 676 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_5::@matElemMul_5<[]>> + %nondet = llzk.nondet : !array.type<1,676 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c676 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_5::@matElemMul_5<[]>>, !array.type<1,676 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_5::@matElemMul_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, %arg1: !array.type<1,676 x !felt.type<"babybear">>, %arg2: !array.type<1,676 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c676 = arith.constant 676 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_5::@matElemMul_5<[]>>, !array.type<1,676 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c676 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_6 { + struct.def @matElemSum_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<676 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,676 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_6::@matElemSum_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c675 = arith.constant 675 : index + %c1 = arith.constant 1 : index + %c676 = arith.constant 676 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_6::@matElemSum_6<[]>> + %nondet = llzk.nondet : !array.type<676 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c676 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c675] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_6::@matElemSum_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_6::@matElemSum_6<[]>>, !array.type<676 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_6::@matElemSum_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, %arg1: !array.type<1,676 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c675 = arith.constant 675 : index + %c1 = arith.constant 1 : index + %c676 = arith.constant 676 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_6::@matElemSum_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_6::@matElemSum_6<[]>>, !array.type<676 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c676 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c675] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_7 { + struct.def @matMul_7 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>> + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,676 x !felt.type<"babybear">>, %arg1: !array.type<676,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_7::@matMul_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1352 = arith.constant 1352 : index + %c676 = arith.constant 676 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_7::@matMul_7<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c676 : <[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c1352 : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c676 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %16 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %32 = function.call @matElemMul_5::@matElemMul_5::@compute(%30, %31) : (!array.type<1,676 x !felt.type<"babybear">>, !array.type<1,676 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_5::@matElemMul_5<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + array.write %array_1[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <676,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %26 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %32 = function.call @matElemMul_5::@matElemMul_5::@compute(%30, %31) : (!array.type<1,676 x !felt.type<"babybear">>, !array.type<1,676 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_5::@matElemMul_5<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + array.write %array_1[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c676 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_5::@matElemMul_5<[]>>, !array.type<1,676 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]> + %19 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %24 = function.call @matElemSum_6::@matElemSum_6::@compute(%23) : (!array.type<1,676 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_6::@matElemSum_6<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_6::@matElemSum_6<[]>> + array.write %array[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_6::@matElemSum_6<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_6::@matElemSum_6<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemSumComp$inputs] = %array_0 : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>> + %2 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_6::@matElemSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_6::@matElemSum_6<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>>, !struct.type<@matElemSum_6::@matElemSum_6<[]>> + struct.writem %self[@matElemSumComp] = %array_3 : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>> + struct.writem %self[@matElemMulComp$inputs] = %array_2 : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>> + %4 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_5::@matElemMul_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + struct.writem %self[@matElemMulComp] = %array_4 : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_7::@matMul_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_7::@matMul_7<[]>>, %arg1: !array.type<1,676 x !felt.type<"babybear">>, %arg2: !array.type<676,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c676 = arith.constant 676 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemSumComp] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>> + %2 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemMulComp] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>> + %4 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c676 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <676,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c676 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_5::@matElemMul_5<[]>>, !array.type<1,676 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>>, !struct.type<@matElemSum_6::@matElemSum_6<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_6::@matElemSum_6<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_6::@matElemSum_6<[]>>>, !struct.type<@matElemSum_6::@matElemSum_6<[]>> + %6 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + function.call @matElemSum_6::@matElemSum_6::@constrain(%5, %7) : (!struct.type<@matElemSum_6::@matElemSum_6<[]>>, !array.type<1,676 x !felt.type<"babybear">>) -> () + %8 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_5::@matElemMul_5<[]>>>, !struct.type<@matElemMul_5::@matElemMul_5<[]>> + %9 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]> + %10 = pod.read %9[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %11 = pod.read %9[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<1,676 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + function.call @matElemMul_5::@matElemMul_5::@constrain(%8, %10, %11) : (!struct.type<@matElemMul_5::@matElemMul_5<[]>>, !array.type<1,676 x !felt.type<"babybear">>, !array.type<1,676 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_8 { + struct.def @Dense_8 { + struct.member @out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<10 x !struct.type<@matMul_7::@matMul_7<[]>>> + struct.member @dot$inputs : !array.type<10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<676 x !felt.type<"babybear">>, %arg1: !array.type<676,10 x !felt.type<"babybear">>, %arg2: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c676 = arith.constant 676 : index + %c1352 = arith.constant 1352 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %self = struct.new : <@Dense_8::@Dense_8<[]>> + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + %array = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c1352 : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3] = %0 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c676 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %arg0[%11] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %15 = pod.read %14[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %16 = cast.toindex %10 : !felt.type<"babybear"> + array.write %15[%c0, %16] = %12 : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %array_0[%17] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + pod.write %18[@a] = %15 : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %19 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%19] = %18 : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = array.read %array[%20] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %40 = pod.read %18[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %41 = pod.read %18[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<676,1 x !felt.type<"babybear">> + %42 = function.call @matMul_7::@matMul_7::@compute(%40, %41) : (!array.type<1,676 x !felt.type<"babybear">>, !array.type<676,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_7::@matMul_7<[]>> + pod.write %21[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_7::@matMul_7<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %21 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + } + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = array.read %arg1[%25, %26] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %30 = pod.read %29[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<676,1 x !felt.type<"babybear">> + %31 = cast.toindex %10 : !felt.type<"babybear"> + array.write %30[%31, %c0] = %27 : <676,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + %33 = array.read %array_0[%32] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + pod.write %33[@b] = %30 : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<676,1 x !felt.type<"babybear">> + %34 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%34] = %33 : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %35 = cast.toindex %0 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %41 = pod.read %33[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<676,1 x !felt.type<"babybear">> + %42 = function.call @matMul_7::@matMul_7::@compute(%40, %41) : (!array.type<1,676 x !felt.type<"babybear">>, !array.type<676,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_7::@matMul_7<[]>> + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_7::@matMul_7<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %36 : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + } + } + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_7::@matMul_7<[]>> + %4 = struct.readm %3[@out] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %5 = array.read %4[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %arg2[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <10 x !struct.type<@matMul_7::@matMul_7<[]>>> + scf.for %arg3 = %c0 to %c10 step %c1 { + %0 = array.read %array[%arg3] : <10 x !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_7::@matMul_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_7::@matMul_7<[]>> + array.write %array_1[%arg3] = %1 : <10 x !struct.type<@matMul_7::@matMul_7<[]>>>, !struct.type<@matMul_7::@matMul_7<[]>> + } + struct.writem %self[@dot] = %array_1 : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !struct.type<@matMul_7::@matMul_7<[]>>> + struct.writem %self[@out] = %nondet : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> + function.return %self : !struct.type<@Dense_8::@Dense_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_8::@Dense_8<[]>>, %arg1: !array.type<676 x !felt.type<"babybear">>, %arg2: !array.type<676,10 x !felt.type<"babybear">>, %arg3: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c676 = arith.constant 676 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c10 = arith.constant 10 : index + %0 = struct.readm %arg0[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@dot] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !struct.type<@matMul_7::@matMul_7<[]>>> + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c676 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = array.read %arg1[%14] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %19 = cast.toindex %13 : !felt.type<"babybear"> + %20 = array.read %18[%c0, %19] : <1,676 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %13 : !felt.type<"babybear"> + %22 = cast.toindex %3 : !felt.type<"babybear"> + %23 = array.read %arg2[%21, %22] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %3 : !felt.type<"babybear"> + %25 = array.read %2[%24] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %26 = pod.read %25[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<676,1 x !felt.type<"babybear">> + %27 = cast.toindex %13 : !felt.type<"babybear"> + %28 = array.read %26[%27, %c0] : <676,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <10 x !struct.type<@matMul_7::@matMul_7<[]>>>, !struct.type<@matMul_7::@matMul_7<[]>> + %6 = struct.readm %5[@out] : <@matMul_7::@matMul_7<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg3[%8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %0[%11] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c10 step %c1 { + %3 = array.read %1[%arg4] : <10 x !struct.type<@matMul_7::@matMul_7<[]>>>, !struct.type<@matMul_7::@matMul_7<[]>> + %4 = array.read %2[%arg4] : <10 x !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<1,676 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<1,676 x !felt.type<"babybear">>, @b: !array.type<676,1 x !felt.type<"babybear">>]>, !array.type<676,1 x !felt.type<"babybear">> + function.call @matMul_7::@matMul_7::@constrain(%3, %5, %6) : (!struct.type<@matMul_7::@matMul_7<[]>>, !array.type<1,676 x !felt.type<"babybear">>, !array.type<676,1 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @Num2Bits_9 { + struct.def @Num2Bits_9 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_10 { + struct.def @LessThan_10 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_9::@Num2Bits_9::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + %26 = function.call @Num2Bits_9::@Num2Bits_9::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_9::@Num2Bits_9::@constrain(%13, %23) : (!struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_10::@LessThan_10<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_9::@Num2Bits_9::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_10::@LessThan_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_10::@LessThan_10<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_9::@Num2Bits_9::@constrain(%1, %11) : (!struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_11 { + struct.def @GreaterThan_11 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_10::@LessThan_10<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_10::@LessThan_10::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> + %26 = function.call @LessThan_10::@LessThan_10::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_10::@LessThan_10::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_11::@GreaterThan_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_11::@GreaterThan_11<[]>>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_11::@GreaterThan_11<[]>>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_11::@GreaterThan_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_10::@LessThan_10::@constrain(%14, %23) : (!struct.type<@LessThan_10::@LessThan_10<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_10::@LessThan_10::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_10::@LessThan_10::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_11::@GreaterThan_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_11::@GreaterThan_11<[]>>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_11::@GreaterThan_11<[]>>, !struct.type<@LessThan_10::@LessThan_10<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_11::@GreaterThan_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_10::@LessThan_10::@constrain(%1, %10) : (!struct.type<@LessThan_10::@LessThan_10<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Switcher_12 { + struct.def @Switcher_12 { + struct.member @outL : !felt.type<"babybear"> {llzk.pub} + struct.member @outR : !felt.type<"babybear"> {llzk.pub} + struct.member @aux : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@Switcher_12::@Switcher_12<[]>> + %0 = felt.sub %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@aux] = %1 : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> + %2 = felt.add %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outL] = %2 : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> + %3 = felt.neg %1 : !felt.type<"babybear"> + %4 = felt.add %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@outR] = %4 : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Switcher_12::@Switcher_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@Switcher_12::@Switcher_12<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@outR] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@aux] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> + %3 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.neg %2 : !felt.type<"babybear"> + %7 = felt.add %6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ArgMax_13 { + struct.def @ArgMax_13 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @maxs : !array.type<11 x !felt.type<"babybear">> + struct.member @amaxs : !array.type<11 x !felt.type<"babybear">> + struct.member @aswitchers : !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> + struct.member @aswitchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + struct.member @gts : !array.type<10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> + struct.member @gts$inputs : !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @switchers : !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> + struct.member @switchers$inputs : !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_13::@ArgMax_13<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %15 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %15 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet_0[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c1] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %136 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_11::@GreaterThan_11::@product(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> + %138 = function.call @GreaterThan_11::@GreaterThan_11::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + pod.write %25[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %139 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%139] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg0[%29] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_3[%31] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c0] = %30 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_3[%34] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %35[@in] = %33 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%36] = %35 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_2[%37] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %136 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %137 = function.call @GreaterThan_11::@GreaterThan_11::@compute(%136) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + pod.write %38[@comp] = %137 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %138 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%138] = %38 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_2[%42] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_5[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@sel] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_4[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %136 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_12::@Switcher_12::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %53[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %nondet_0[%57] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_5[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@L] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_4[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %136 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_12::@Switcher_12::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %66[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %arg0[%70] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_5[%73] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %74[@R] = %71 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%76] = %74 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %77 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + %79 = array.read %array_4[%78] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %81 = arith.subi %80, %c1 {product_source = "compute"} : index + pod.write %79[@count] = %81 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %82 = arith.cmpi eq, %81, %c0 {product_source = "compute"} : index + scf.if %82 { + %136 = pod.read %74[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %74[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %74[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_12::@Switcher_12::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %79[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%141] = %79 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %83 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %array_2[%83] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %85 = pod.read %84[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %86 = struct.readm %85[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_1[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@sel] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %136 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_12::@Switcher_12::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %94[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %nondet[%98] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %101 = cast.toindex %100 : !felt.type<"babybear"> {product_source = "compute"} + %102 = array.read %array_1[%101] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %102[@L] = %99 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %103 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%104] = %102 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %105 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + %107 = array.read %array[%106] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %108 = pod.read %107[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %109 = arith.subi %108, %c1 {product_source = "compute"} : index + pod.write %107[@count] = %109 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %110 = arith.cmpi eq, %109, %c0 {product_source = "compute"} : index + scf.if %110 { + %136 = pod.read %102[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %102[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %102[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_12::@Switcher_12::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %107[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %107 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %111 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + %113 = array.read %array_1[%112] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %113[@R] = %15 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%115] = %113 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %116 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %120 = arith.subi %119, %c1 {product_source = "compute"} : index + pod.write %118[@count] = %120 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %121 = arith.cmpi eq, %120, %c0 {product_source = "compute"} : index + scf.if %121 { + %136 = pod.read %113[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %113[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %138 = pod.read %113[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %139 = function.call @Switcher_12::@Switcher_12::@compute(%136, %137, %138) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %118[@comp] = %139 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %140 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%141] = %118 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %122 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %122 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %array[%123] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %125 = pod.read %124[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %126 = struct.readm %125[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %127 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%128] = %126 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %129 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "compute"} + %131 = array.read %array_4[%130] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %132 = pod.read %131[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %133 = struct.readm %132[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %134 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %135 = cast.toindex %134 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%135] = %133 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_5 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %16 : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_1 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %16 : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_7 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_3 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_8 = array.new : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %16 : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_8 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet_0 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %self[@maxs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@amaxs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@aswitchers] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@aswitchers$inputs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %self[@gts] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> {product_source = "constrain"} + %8 = struct.readm %self[@gts$inputs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %9 = struct.readm %self[@switchers] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "constrain"} + %10 = struct.readm %self[@switchers$inputs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %11 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %3[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %4[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %3[%16] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %8[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg0[%22] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %8[%24] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %26[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %7[%28] : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %10[%32] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = pod.read %33[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %3[%35] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %10[%38] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %40 = pod.read %39[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %arg0[%41] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %10[%44] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %7[%47] : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "constrain"} + %49 = struct.readm %48[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %6[%51] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %4[%54] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %6[%57] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %59 = pod.read %58[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %6[%61] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %63 = pod.read %62[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %5[%65] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %67 = struct.readm %66[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %68 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %4[%69] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %70, %67 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %9[%72] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %74 = struct.readm %73[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = felt.add %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %75 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %3[%76] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = array.read %4[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %9[%arg1] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %16 = array.read %10[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_12::@Switcher_12::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %15 = array.read %5[%arg1] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %16 = array.read %6[%arg1] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_12::@Switcher_12::@constrain(%15, %17, %18, %19) : (!struct.type<@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %15 = array.read %7[%arg1] : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "constrain"} + %16 = array.read %8[%arg1] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_11::@GreaterThan_11::@constrain(%15, %17) : (!struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@ArgMax_13::@ArgMax_13<[]>> + } + function.def @compute(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_13::@ArgMax_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %2 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c3 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_4[%arg1] = %2 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_5 = array.new : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_0 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet_0[%3] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_3[%5] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_3[%8] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%10] = %9 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_2[%11] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %123 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_11::@GreaterThan_11::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + pod.write %12[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%125] = %12 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%16] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %17 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_3[%21] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %22[@in] = %20 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%23] = %22 : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %123 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %124 = function.call @GreaterThan_11::@GreaterThan_11::@compute(%123) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + pod.write %25[@comp] = %124 : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %125 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%125] = %25 : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %array_2[%29] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_5[%34] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@sel] = %32 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%37] = %35 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_4[%39] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %123 = pod.read %35[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %35[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %35[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_12::@Switcher_12::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %40[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %40 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet_0[%44] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_5[%47] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@L] = %45 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%50] = %48 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_4[%52] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %123 = pod.read %48[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %48[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %48[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_12::@Switcher_12::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %53[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %53 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %arg0[%57] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %59 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_5[%60] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %61[@R] = %58 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%63] = %61 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %64 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_4[%65] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %123 = pod.read %61[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %61[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %61[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_12::@Switcher_12::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %66[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%128] = %66 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_2[%70] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %72 = pod.read %71[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array_1[%75] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %76[@sel] = %73 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %77 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %77 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%78] = %76 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %79 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %array[%80] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %82 = pod.read %81[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.subi %82, %c1 {product_source = "compute"} : index + pod.write %81[@count] = %83 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.cmpi eq, %83, %c0 {product_source = "compute"} : index + scf.if %84 { + %123 = pod.read %76[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %76[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %76[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_12::@Switcher_12::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %81[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %81 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %85 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %nondet[%85] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %87 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_1[%88] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %89[@L] = %86 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %90 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %90 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%91] = %89 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %92 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array[%93] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.subi %95, %c1 {product_source = "compute"} : index + pod.write %94[@count] = %96 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.cmpi eq, %96, %c0 {product_source = "compute"} : index + scf.if %97 { + %123 = pod.read %89[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %89[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %89[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_12::@Switcher_12::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %94[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %94 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %98 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %array_1[%99] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %100[@R] = %2 : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %101 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %101 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%102] = %100 : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "compute"} + %103 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %104 = cast.toindex %103 : !felt.type<"babybear"> {product_source = "compute"} + %105 = array.read %array[%104] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %106 = pod.read %105[@count] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.subi %106, %c1 {product_source = "compute"} : index + pod.write %105[@count] = %107 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.cmpi eq, %107, %c0 {product_source = "compute"} : index + scf.if %108 { + %123 = pod.read %100[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %100[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %100[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Switcher_12::@Switcher_12::@compute(%123, %124, %125) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + pod.write %105[@comp] = %126 : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %127 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %127 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%128] = %105 : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %109 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %110 = cast.toindex %109 : !felt.type<"babybear"> {product_source = "compute"} + %111 = array.read %array[%110] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %112 = pod.read %111[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %113 = struct.readm %112[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %114 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %115 = cast.toindex %114 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%115] = %113 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %116 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %array_4[%117] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %119 = pod.read %118[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + %120 = struct.readm %119[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %121 = felt.add %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %122 = cast.toindex %121 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%122] = %120 : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@switchers$inputs] = %array_5 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array_4[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + array.write %array_6[%arg1] = %3 : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@switchers] = %array_6 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + struct.writem %self[@aswitchers$inputs] = %array_1 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c11 step %c1 { + %2 = array.read %array[%arg1] : <11 x !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@Switcher_12::@Switcher_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %3 : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aswitchers] = %array_7 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "compute"} + struct.writem %self[@gts$inputs] = %array_3 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_8 = array.new : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = array.read %array_2[%arg1] : <10 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %3 : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@gts] = %array_8 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> {product_source = "compute"} + struct.writem %self[@maxs] = %nondet_0 : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@amaxs] = %nondet : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ArgMax_13::@ArgMax_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, %arg1: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant {product_source = "constrain"} 10 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c11 = arith.constant {product_source = "constrain"} 11 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@maxs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@amaxs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@aswitchers] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aswitchers$inputs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@gts] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@gts$inputs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@switchers] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !struct.type<@Switcher_12::@Switcher_12<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@switchers$inputs] : <@ArgMax_13::@ArgMax_13<[]>>, !array.type<11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = array.read %arg1[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %2[%c0] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %1[%14] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %6[%16] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%20] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %6[%22] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %24 = pod.read %23[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %5[%26] : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "constrain"} + %28 = struct.readm %27[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %8[%30] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %1[%33] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %8[%36] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg1[%39] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %8[%42] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45] : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@GreaterThan_11::@GreaterThan_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %4[%49] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %2[%52] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %4[%55] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %4[%59] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %61 = pod.read %60[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %64 = array.read %3[%63] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %65 = struct.readm %64[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %67 = cast.toindex %66 : !felt.type<"babybear"> {product_source = "constrain"} + %68 = array.read %2[%67] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "constrain"} + %71 = array.read %7[%70] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %72 = struct.readm %71[@outL] : <@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %73 = felt.add %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %1[%74] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %75, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %2[%c10] : <11 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %7[%arg2] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %14 = array.read %8[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_12::@Switcher_12::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c11 step %c1 { + %13 = array.read %3[%arg2] : <11 x !struct.type<@Switcher_12::@Switcher_12<[]>>>, !struct.type<@Switcher_12::@Switcher_12<[]>> {product_source = "constrain"} + %14 = array.read %4[%arg2] : <11 x !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>>, !pod.type<[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = pod.read %14[@sel] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %14[@L] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %14[@R] : <[@sel: !felt.type<"babybear">, @L: !felt.type<"babybear">, @R: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Switcher_12::@Switcher_12::@constrain(%13, %15, %16, %17) : (!struct.type<@Switcher_12::@Switcher_12<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %13 = array.read %5[%arg2] : <10 x !struct.type<@GreaterThan_11::@GreaterThan_11<[]>>>, !struct.type<@GreaterThan_11::@GreaterThan_11<[]>> {product_source = "constrain"} + %14 = array.read %6[%arg2] : <10 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_11::@GreaterThan_11::@constrain(%13, %15) : (!struct.type<@GreaterThan_11::@GreaterThan_11<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_14 { + struct.def @Num2Bits_14 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_14::@Num2Bits_14<[]>> + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<254 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<254 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Num2Bits_15 { + struct.def @Num2Bits_15 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_15::@Num2Bits_15<[]>> + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_15::@Num2Bits_15<[]>>, !array.type<135 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_15::@Num2Bits_15<[]>>, !array.type<135 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @CompConstant_16 { + struct.def @CompConstant_16 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_16::@CompConstant_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@CompConstant_16::@CompConstant_16<[]>> + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.and %23, %24 : i1, i1 + scf.if %25 { + %32 = felt.neg %arg3 : !felt.type<"babybear"> + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg3, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = bool.and %32, %33 : i1, i1 + scf.if %34 { + %35 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg2, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = bool.and %35, %true : i1, i1 + scf.if %36 { + %37 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.add %40, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %37 = felt.neg %arg2 : !felt.type<"babybear"> + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %39, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + %26 = cast.toindex %8 : !felt.type<"babybear"> + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %arg4, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = felt.sub %arg3, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = felt.add %arg2, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %30, %29, %28, %31 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@sout] = %0#2 : <@CompConstant_16::@CompConstant_16<[]>>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0#2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @Num2Bits_15::@Num2Bits_15::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_15::@Num2Bits_15<[]>>, !array.type<135 x !felt.type<"babybear">> + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %6 : <@CompConstant_16::@CompConstant_16<[]>>, !felt.type<"babybear"> + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_16::@CompConstant_16<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + struct.writem %self[@num2bits] = %7 : <@CompConstant_16::@CompConstant_16<[]>>, !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + struct.writem %self[@parts] = %nondet : <@CompConstant_16::@CompConstant_16<[]>>, !array.type<127 x !felt.type<"babybear">> + function.return %self : !struct.type<@CompConstant_16::@CompConstant_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@CompConstant_16::@CompConstant_16<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@parts] : <@CompConstant_16::@CompConstant_16<[]>>, !array.type<127 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@sout] : <@CompConstant_16::@CompConstant_16<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_16::@CompConstant_16<[]>>, !struct.type<@Num2Bits_15::@Num2Bits_15<[]>> + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_16::@CompConstant_16<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_0, %arg6 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = bool.and %25, %26 : i1, i1 + scf.if %27 { + %34 = felt.neg %arg3 : !felt.type<"babybear"> + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg3, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %10 : !felt.type<"babybear"> + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = bool.and %34, %35 : i1, i1 + scf.if %36 { + %37 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = felt.add %44, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = cast.toindex %10 : !felt.type<"babybear"> + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = bool.and %37, %true : i1, i1 + scf.if %38 { + %39 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %10 : !felt.type<"babybear"> + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %39 = felt.neg %arg4 : !felt.type<"babybear"> + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %41, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %10 : !felt.type<"babybear"> + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + %28 = cast.toindex %10 : !felt.type<"babybear"> + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.add %arg5, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.sub %arg3, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.add %arg4, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = felt.mul %arg6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %31, %32, %30, %33 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %2, %5#2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %3[@out] : <@Num2Bits_15::@Num2Bits_15<[]>>, !array.type<135 x !felt.type<"babybear">> + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_15::@Num2Bits_15::@constrain(%3, %9) : (!struct.type<@Num2Bits_15::@Num2Bits_15<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Sign_17 { + struct.def @Sign_17 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_16::@CompConstant_16<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_17::@Sign_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %self = struct.new : <@Sign_17::@Sign_17<[]>> + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %12 = function.call @CompConstant_16::@CompConstant_16::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_16::@CompConstant_16<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_16::@CompConstant_16<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_16::@CompConstant_16<[]>> + %1 = struct.readm %0[@out] : <@CompConstant_16::@CompConstant_16<[]>>, !felt.type<"babybear"> + struct.writem %self[@sign] = %1 : <@Sign_17::@Sign_17<[]>>, !felt.type<"babybear"> + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_17::@Sign_17<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_16::@CompConstant_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_16::@CompConstant_16<[]>> + struct.writem %self[@comp] = %2 : <@Sign_17::@Sign_17<[]>>, !struct.type<@CompConstant_16::@CompConstant_16<[]>> + function.return %self : !struct.type<@Sign_17::@Sign_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_17::@Sign_17<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_17::@Sign_17<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@comp] : <@Sign_17::@Sign_17<[]>>, !struct.type<@CompConstant_16::@CompConstant_16<[]>> + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_17::@Sign_17<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@CompConstant_16::@CompConstant_16<[]>>, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + function.call @CompConstant_16::@CompConstant_16::@constrain(%1, %4) : (!struct.type<@CompConstant_16::@CompConstant_16<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @IsPositive_18 { + struct.def @IsPositive_18 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sign : !struct.type<@Sign_17::@Sign_17<[]>> + struct.member @sign$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @num2Bits : !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + struct.member @num2Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_18::@IsPositive_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %self = struct.new : <@IsPositive_18::@IsPositive_18<[]>> + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_17::@Sign_17<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @Num2Bits_14::@Num2Bits_14::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + } + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + %10 = struct.readm %9[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<254 x !felt.type<"babybear">> + %11 = cast.toindex %8 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %14 = cast.toindex %8 : !felt.type<"babybear"> + array.write %13[%14] = %12 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %13 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Sign_17::@Sign_17<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@Sign_17::@Sign_17<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %18 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %19 = function.call @Sign_17::@Sign_17::@compute(%18) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_17::@Sign_17<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Sign_17::@Sign_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_17::@Sign_17<[]>> + } + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_17::@Sign_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_17::@Sign_17<[]>> + %4 = struct.readm %3[@sign] : <@Sign_17::@Sign_17<[]>>, !felt.type<"babybear"> + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@IsPositive_18::@IsPositive_18<[]>>, !felt.type<"babybear"> + struct.writem %self[@sign$inputs] = %pod_0 : <@IsPositive_18::@IsPositive_18<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Sign_17::@Sign_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_17::@Sign_17<[]>> + struct.writem %self[@sign] = %6 : <@IsPositive_18::@IsPositive_18<[]>>, !struct.type<@Sign_17::@Sign_17<[]>> + struct.writem %self[@num2Bits$inputs] = %pod_2 : <@IsPositive_18::@IsPositive_18<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + struct.writem %self[@num2Bits] = %7 : <@IsPositive_18::@IsPositive_18<[]>>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + function.return %self : !struct.type<@IsPositive_18::@IsPositive_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IsPositive_18::@IsPositive_18<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sign] : <@IsPositive_18::@IsPositive_18<[]>>, !struct.type<@Sign_17::@Sign_17<[]>> + %2 = struct.readm %arg0[@sign$inputs] : <@IsPositive_18::@IsPositive_18<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@num2Bits] : <@IsPositive_18::@IsPositive_18<[]>>, !struct.type<@Num2Bits_14::@Num2Bits_14<[]>> + %4 = struct.readm %arg0[@num2Bits$inputs] : <@IsPositive_18::@IsPositive_18<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c254 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %11 = struct.readm %3[@out] : <@Num2Bits_14::@Num2Bits_14<[]>>, !array.type<254 x !felt.type<"babybear">> + %12 = cast.toindex %10 : !felt.type<"babybear"> + %13 = array.read %11[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %15 = cast.toindex %10 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %6 = struct.readm %1[@sign] : <@Sign_17::@Sign_17<[]>>, !felt.type<"babybear"> + %7 = felt.sub %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + function.call @Sign_17::@Sign_17::@constrain(%1, %8) : (!struct.type<@Sign_17::@Sign_17<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_14::@Num2Bits_14::@constrain(%3, %9) : (!struct.type<@Num2Bits_14::@Num2Bits_14<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ReLU_19 { + struct.def @ReLU_19 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isPositive : !struct.type<@IsPositive_18::@IsPositive_18<[]>> + struct.member @isPositive$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@ReLU_19::@ReLU_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ReLU_19::@ReLU_19<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %7 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %8 = function.call @IsPositive_18::@IsPositive_18::@compute(%7) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_18::@IsPositive_18<[]>> + pod.write %pod[@comp] = %8 : <[@count: index, @comp: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_18::@IsPositive_18<[]>> + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_18::@IsPositive_18<[]>> + %4 = struct.readm %3[@out] : <@IsPositive_18::@IsPositive_18<[]>>, !felt.type<"babybear"> + %5 = felt.mul %arg0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear"> + struct.writem %self[@isPositive$inputs] = %pod_0 : <@ReLU_19::@ReLU_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_18::@IsPositive_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_18::@IsPositive_18<[]>> + struct.writem %self[@isPositive] = %6 : <@ReLU_19::@ReLU_19<[]>>, !struct.type<@IsPositive_18::@IsPositive_18<[]>> + function.return %self : !struct.type<@ReLU_19::@ReLU_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@ReLU_19::@ReLU_19<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@isPositive] : <@ReLU_19::@ReLU_19<[]>>, !struct.type<@IsPositive_18::@IsPositive_18<[]>> + %2 = struct.readm %arg0[@isPositive$inputs] : <@ReLU_19::@ReLU_19<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %3 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = struct.readm %1[@out] : <@IsPositive_18::@IsPositive_18<[]>>, !felt.type<"babybear"> + %5 = felt.mul %arg1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @IsPositive_18::@IsPositive_18::@constrain(%1, %6) : (!struct.type<@IsPositive_18::@IsPositive_18<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @mnist_20 { + struct.def @mnist_20 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @dense_out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @relu : !array.type<676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> + struct.member @relu$inputs : !array.type<676 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @dense : !struct.type<@Dense_8::@Dense_8<[]>> + struct.member @dense$inputs : !pod.type<[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> + struct.member @conv2d : !struct.type<@Conv2D_3::@Conv2D_3<[]>> + struct.member @conv2d$inputs : !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> + struct.member @flatten : !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> + struct.member @flatten$inputs : !pod.type<[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> + struct.member @argmax : !struct.type<@ArgMax_13::@ArgMax_13<[]>> + struct.member @argmax$inputs : !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,1 x !felt.type<"babybear">>, %arg2: !array.type<1 x !felt.type<"babybear">>, %arg3: !array.type<676,10 x !felt.type<"babybear">>, %arg4: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_20::@mnist_20<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c26 = arith.constant 26 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c794 = arith.constant {product_source = "compute"} 794 : index + %c7446 = arith.constant {product_source = "compute"} 7446 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c676 = arith.constant {product_source = "compute"} 676 : index + %self = struct.new : <@mnist_20::@mnist_20<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %35 = array.read %array[%arg5] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %35[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg5] = %35 : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <676 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c7446 } : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c794 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_4 = pod.new { @count = %c676 } : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_6 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_7 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg5 = %c0 to %c28 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c28 step %c1 { + %36 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %arg0[%37, %38, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41, %42, %c0] = %39 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@in] = %40 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %43 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %44 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %49 = function.call @Conv2D_3::@Conv2D_3::@compute(%46, %47, %48) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %49 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %36 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %arg1[%37, %38, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41, %42, %c0, %c0] = %39 : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@weights] = %40 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %43 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %44 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %49 = function.call @Conv2D_3::@Conv2D_3::@compute(%46, %47, %48) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %49 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@bias] = %1 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %3 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %35 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @Conv2D_3::@Conv2D_3::@compute(%35, %36, %37) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %38 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c26 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c26 step %c1 { + %36 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %38[%39, %40, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_5[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %42[%43, %44, %c0] = %41 : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %42 : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %46 : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %pod_5[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %49 = function.call @Flatten2D_4::@Flatten2D_4::@product(%48) : (!array.type<26,26,1 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> + %50 = function.call @Flatten2D_4::@Flatten2D_4::@compute(%48) : (!array.type<26,26,1 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %49 : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_0[%40] : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %41[@in] = %39 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%42] = %41 : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %43 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%43] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %57 = pod.read %41[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @ReLU_19::@ReLU_19::@compute(%57) : (!felt.type<"babybear">) -> !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + pod.write %44[@comp] = %58 : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + %59 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%59] = %44 : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array[%48] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %50 = pod.read %49[@comp] : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + %51 = struct.readm %50[@out] : <@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53] = %51 : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@in] = %52 : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %55 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %57 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %58 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %59 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %60 = function.call @Dense_8::@Dense_8::@compute(%57, %58, %59) : (!array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %60 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c10 step %c1 { + %57 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %arg3[%58, %59] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %62 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %61[%62, %63] = %60 : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@weights] = %61 : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %65 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %67 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %68 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %69 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %70 = function.call @Dense_8::@Dense_8::@compute(%67, %68, %69) : (!array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %70 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c10 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg4[%36] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@bias] = %38 : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %41 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %46 = function.call @Dense_8::@Dense_8::@compute(%43, %44, %45) : (!array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %46 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c10 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%40] = %39 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + %42 = struct.readm %41[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %42[%43] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %pod_7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %45[%46] = %44 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@in] = %45 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %pod_6[@count] : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %pod_6[@count] = %48 : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %50 = pod.read %pod_7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %51 = function.call @ArgMax_13::@ArgMax_13::@product(%50) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_13::@ArgMax_13<[]>> + %52 = function.call @ArgMax_13::@ArgMax_13::@compute(%50) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + pod.write %pod_6[@comp] = %51 : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@mnist_20::@mnist_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_1 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %7 : <@mnist_20::@mnist_20<[]>>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_5 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %8 : <@mnist_20::@mnist_20<[]>>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + struct.writem %self[@conv2d$inputs] = %pod_3 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d] = %9 : <@mnist_20::@mnist_20<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_7 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %10 : <@mnist_20::@mnist_20<[]>>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + struct.writem %self[@relu$inputs] = %array_0 : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> {product_source = "compute"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %35 = array.read %array[%arg5] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@comp] : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + array.write %array_8[%arg5] = %36 : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu] = %array_8 : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_20::@mnist_20<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %11 = struct.readm %self[@out] : <@mnist_20::@mnist_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %self[@dense_out] : <@mnist_20::@mnist_20<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = struct.readm %self[@relu] : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> {product_source = "constrain"} + %14 = struct.readm %self[@relu$inputs] : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %15 = struct.readm %self[@dense] : <@mnist_20::@mnist_20<[]>>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@dense$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %self[@conv2d] : <@mnist_20::@mnist_20<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@conv2d$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %self[@flatten] : <@mnist_20::@mnist_20<[]>>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "constrain"} + %20 = struct.readm %self[@flatten$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %self[@argmax] : <@mnist_20::@mnist_20<[]>>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "constrain"} + %22 = struct.readm %self[@argmax$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c28 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c28 step %c1 { + %36 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %arg0[%37, %38, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = pod.read %18[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %40[%41, %42, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %36 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %arg1[%37, %38, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = pod.read %18[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %40[%41, %42, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %23 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %18[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c26 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c26 step %c1 { + %36 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %37 = struct.readm %17[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %37[%38, %39, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = pod.read %20[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %41[%42, %43, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = struct.readm %19[@out] : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %36[%37] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %14[%39] : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %41 = pod.read %40[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %13[%42] : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "constrain"} + %44 = struct.readm %43[@out] : <@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %16[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c10 step %c1 { + %48 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %arg3[%49, %50] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %16[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %52[%53, %54] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c10 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %arg4[%36] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %16[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %38[%39] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c10 step %c1 { + %35 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = struct.readm %15[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %36[%37] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %12[%39] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = struct.readm %15[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %41[%42] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = pod.read %22[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %44[%45] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %26 = struct.readm %21[@out] : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %16[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = pod.read %16[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = pod.read %16[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_8::@Dense_8::@constrain(%15, %27, %28, %29) : (!struct.type<@Dense_8::@Dense_8<[]>>, !array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %30 = pod.read %20[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_4::@Flatten2D_4::@constrain(%19, %30) : (!struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<26,26,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %31 = pod.read %18[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = pod.read %18[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = pod.read %18[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%17, %31, %32, %33) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %34 = pod.read %22[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_13::@ArgMax_13::@constrain(%21, %34) : (!struct.type<@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %35 = array.read %13[%arg5] : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "constrain"} + %36 = array.read %14[%arg5] : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %37 = pod.read %36[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_19::@ReLU_19::@constrain(%35, %37) : (!struct.type<@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@mnist_20::@mnist_20<[]>> + } + function.def @compute(%arg0: !array.type<28,28,1 x !felt.type<"babybear">>, %arg1: !array.type<3,3,1,1 x !felt.type<"babybear">>, %arg2: !array.type<1 x !felt.type<"babybear">>, %arg3: !array.type<676,10 x !felt.type<"babybear">>, %arg4: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@mnist_20::@mnist_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c26 = arith.constant 26 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c10 = arith.constant {product_source = "compute"} 10 : index + %c794 = arith.constant {product_source = "compute"} 794 : index + %c7446 = arith.constant {product_source = "compute"} 7446 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c676 = arith.constant {product_source = "compute"} 676 : index + %self = struct.new : <@mnist_20::@mnist_20<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %11 = array.read %array[%arg5] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %11[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg5] = %11 : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <676 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c7446 } : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c794 } : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_4 = pod.new { @count = %c676 } : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_6 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_7 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg5 = %c0 to %c28 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c28 step %c1 { + %12 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%13, %14, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18, %c0] = %15 : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@in] = %16 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %20 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @Conv2D_3::@Conv2D_3::@compute(%22, %23, %24) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %25 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c3 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg1[%13, %14, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17, %18, %c0, %c0] = %15 : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@weights] = %16 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %20 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @Conv2D_3::@Conv2D_3::@compute(%22, %23, %24) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %25 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@bias] = %1 : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %3 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %11 = pod.read %pod_3[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod_3[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod_3[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @Conv2D_3::@Conv2D_3::@compute(%11, %12, %13) : (!array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %14 : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c26 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg6 = %c0 to %c26 step %c1 { + %12 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %14[%15, %16, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_5[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %18[%19, %20, %c0] = %17 : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %18 : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %22 : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %pod_5[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @Flatten2D_4::@Flatten2D_4::@compute(%24) : (!array.type<26,26,1 x !felt.type<"babybear">>) -> !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %25 : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_0[%16] : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@in] = %15 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%18] = %17 : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%19] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = function.call @ReLU_19::@ReLU_19::@compute(%33) : (!felt.type<"babybear">) -> !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + pod.write %20[@comp] = %34 : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + %35 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%35] = %20 : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%24] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@comp] : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + %27 = struct.readm %26[@out] : <@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@in] = %28 : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %36 = function.call @Dense_8::@Dense_8::@compute(%33, %34, %35) : (!array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %36 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg6 = %c0 to %c10 step %c1 { + %33 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %arg3[%34, %35] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + array.write %37[%38, %39] = %36 : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@weights] = %37 : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %41 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %46 = function.call @Dense_8::@Dense_8::@compute(%43, %44, %45) : (!array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %46 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg4[%12] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@bias] = %14 : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_1[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_1[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_1[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @Dense_8::@Dense_8::@compute(%19, %20, %21) : (!array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg5 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %13[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %15 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %18[%19] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@in] = %21 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_6[@count] : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_6[@count] = %24 : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @ArgMax_13::@ArgMax_13::@compute(%26) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + pod.write %pod_6[@comp] = %27 : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@mnist_20::@mnist_20<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@dense$inputs] = %pod_1 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_8::@Dense_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + struct.writem %self[@dense] = %7 : <@mnist_20::@mnist_20<[]>>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "compute"} + struct.writem %self[@flatten$inputs] = %pod_5 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + struct.writem %self[@flatten] = %8 : <@mnist_20::@mnist_20<[]>>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "compute"} + struct.writem %self[@conv2d$inputs] = %pod_3 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Conv2D_3::@Conv2D_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@conv2d] = %9 : <@mnist_20::@mnist_20<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "compute"} + struct.writem %self[@argmax$inputs] = %pod_7 : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@ArgMax_13::@ArgMax_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + struct.writem %self[@argmax] = %10 : <@mnist_20::@mnist_20<[]>>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "compute"} + struct.writem %self[@relu$inputs] = %array_0 : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> {product_source = "compute"} + scf.for %arg5 = %c0 to %c676 step %c1 { + %11 = array.read %array[%arg5] : <676 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ReLU_19::@ReLU_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + array.write %array_8[%arg5] = %12 : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu] = %array_8 : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> {product_source = "compute"} + struct.writem %self[@dense_out] = %nondet : <@mnist_20::@mnist_20<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@mnist_20::@mnist_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@mnist_20::@mnist_20<[]>>, %arg1: !array.type<28,28,1 x !felt.type<"babybear">>, %arg2: !array.type<3,3,1,1 x !felt.type<"babybear">>, %arg3: !array.type<1 x !felt.type<"babybear">>, %arg4: !array.type<676,10 x !felt.type<"babybear">>, %arg5: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant 10 : index + %c26 = arith.constant 26 : index + %c3 = arith.constant 3 : index + %c28 = arith.constant 28 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c676 = arith.constant {product_source = "constrain"} 676 : index + %0 = struct.readm %arg0[@out] : <@mnist_20::@mnist_20<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@dense_out] : <@mnist_20::@mnist_20<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@relu] : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !struct.type<@ReLU_19::@ReLU_19<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@relu$inputs] : <@mnist_20::@mnist_20<[]>>, !array.type<676 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@dense] : <@mnist_20::@mnist_20<[]>>, !struct.type<@Dense_8::@Dense_8<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@dense$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@conv2d] : <@mnist_20::@mnist_20<[]>>, !struct.type<@Conv2D_3::@Conv2D_3<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@conv2d$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %arg0[@flatten] : <@mnist_20::@mnist_20<[]>>, !struct.type<@Flatten2D_4::@Flatten2D_4<[]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@flatten$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<26,26,1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = struct.readm %arg0[@argmax] : <@mnist_20::@mnist_20<[]>>, !struct.type<@ArgMax_13::@ArgMax_13<[]>> {product_source = "constrain"} + %11 = struct.readm %arg0[@argmax$inputs] : <@mnist_20::@mnist_20<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c28 step %c1 { + %24 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c28 step %c1 { + %25 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg1[%26, %27, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %7[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31, %c0] : <28,28,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c3 step %c1 { + %24 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c3 step %c1 { + %25 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg2[%26, %27, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %7[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %29[%30, %31, %c0, %c0] : <3,3,1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %arg3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %7[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg6 = %c0 to %c26 step %c1 { + %24 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c26 step %c1 { + %25 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %26 = struct.readm %6[@out] : <@Conv2D_3::@Conv2D_3<[]>>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %26[%27, %28, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %9[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %30[%31, %32, %c0] : <26,26,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c676 step %c1 { + %24 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %25 = struct.readm %8[@out] : <@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %25[%26] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %3[%28] : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %2[%31] : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %5[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %34[%35] : <676 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg7 = %c0 to %c10 step %c1 { + %37 = cast.tofelt %arg7 : index, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg4[%38, %39] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = pod.read %5[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %41[%42, %43] : <676,10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c10 step %c1 { + %24 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg5[%25] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %5[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg6 = %c0 to %c10 step %c1 { + %24 = cast.tofelt %arg6 : index, !felt.type<"babybear"> {product_source = "constrain"} + %25 = struct.readm %4[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %25[%26] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = struct.readm %4[@out] : <@Dense_8::@Dense_8<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %11[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %33[%34] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %15 = struct.readm %10[@out] : <@ArgMax_13::@ArgMax_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %5[@in] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = pod.read %5[@weights] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<676,10 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = pod.read %5[@bias] : <[@in: !array.type<676 x !felt.type<"babybear">>, @weights: !array.type<676,10 x !felt.type<"babybear">>, @bias: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_8::@Dense_8::@constrain(%4, %16, %17, %18) : (!struct.type<@Dense_8::@Dense_8<[]>>, !array.type<676 x !felt.type<"babybear">>, !array.type<676,10 x !felt.type<"babybear">>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %19 = pod.read %9[@in] : <[@in: !array.type<26,26,1 x !felt.type<"babybear">>]>, !array.type<26,26,1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Flatten2D_4::@Flatten2D_4::@constrain(%8, %19) : (!struct.type<@Flatten2D_4::@Flatten2D_4<[]>>, !array.type<26,26,1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %20 = pod.read %7[@in] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<28,28,1 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = pod.read %7[@weights] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<3,3,1,1 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = pod.read %7[@bias] : <[@in: !array.type<28,28,1 x !felt.type<"babybear">>, @weights: !array.type<3,3,1,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Conv2D_3::@Conv2D_3::@constrain(%6, %20, %21, %22) : (!struct.type<@Conv2D_3::@Conv2D_3<[]>>, !array.type<28,28,1 x !felt.type<"babybear">>, !array.type<3,3,1,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %23 = pod.read %11[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ArgMax_13::@ArgMax_13::@constrain(%10, %23) : (!struct.type<@ArgMax_13::@ArgMax_13<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg6 = %c0 to %c676 step %c1 { + %24 = array.read %2[%arg6] : <676 x !struct.type<@ReLU_19::@ReLU_19<[]>>>, !struct.type<@ReLU_19::@ReLU_19<[]>> {product_source = "constrain"} + %25 = array.read %3[%arg6] : <676 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_19::@ReLU_19::@constrain(%24, %26) : (!struct.type<@ReLU_19::@ReLU_19<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/model1_test.llzk b/examples/circom-demo/model1_test.llzk new file mode 100644 index 0000000..6d024f5 --- /dev/null +++ b/examples/circom-demo/model1_test.llzk @@ -0,0 +1,2462 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@model1_14::@model1_14<[]>>} { + poly.template @matElemMul_0 { + struct.def @matElemMul_0 { + struct.member @out : !array.type<1,3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_0::@matElemMul_0<[]>> + %nondet = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_0::@matElemMul_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>, %arg2: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_1 { + struct.def @matElemSum_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<3 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_1::@matElemSum_1<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %arg3 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_1::@matElemSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_1::@matElemSum_1<[]>>, !array.type<3 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %1[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %7 : !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %arg4 : !felt.type<"babybear"> + %17 = array.read %1[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9 : !felt.type<"babybear"> + } + scf.yield %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_2 { + struct.def @matMul_2 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>, %arg1: !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_2::@matMul_2<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c6 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %16 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %32 = function.call @matElemMul_0::@matElemMul_0::@compute(%30, %31) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_1[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %26 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %32 = function.call @matElemMul_0::@matElemMul_0::@compute(%30, %31) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_0::@matElemMul_0<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_1[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %19 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %24 = function.call @matElemSum_1::@matElemSum_1::@compute(%23) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_1::@matElemSum_1<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemSumComp$inputs] = %array_0 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_1::@matElemSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + struct.writem %self[@matElemSumComp] = %array_3 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + struct.writem %self[@matElemMulComp$inputs] = %array_2 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_0::@matElemMul_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + struct.writem %self[@matElemMulComp] = %array_4 : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_2::@matMul_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_2::@matMul_2<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>, %arg2: !array.type<3,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemSumComp] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>> + %2 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemMulComp] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>> + %4 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_1::@matElemSum_1<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemSum_1::@matElemSum_1<[]>>>, !struct.type<@matElemSum_1::@matElemSum_1<[]>> + %6 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + function.call @matElemSum_1::@matElemSum_1::@constrain(%5, %7) : (!struct.type<@matElemSum_1::@matElemSum_1<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () + %8 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemMul_0::@matElemMul_0<[]>>>, !struct.type<@matElemMul_0::@matElemMul_0<[]>> + %9 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]> + %10 = pod.read %9[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %11 = pod.read %9[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + function.call @matElemMul_0::@matElemMul_0::@constrain(%8, %10, %11) : (!struct.type<@matElemMul_0::@matElemMul_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<1,3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_3 { + struct.def @Dense_3 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> + struct.member @dot$inputs : !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@Dense_3::@Dense_3<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c6 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg3] = %0 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = cast.toindex %10 : !felt.type<"babybear"> + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %15 = pod.read %14[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %16 = cast.toindex %10 : !felt.type<"babybear"> + array.write %15[%c0, %16] = %12 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %array_0[%17] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + pod.write %18[@a] = %15 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %19 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%19] = %18 : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %20 = cast.toindex %0 : !felt.type<"babybear"> + %21 = array.read %array[%20] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %40 = pod.read %18[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %41 = pod.read %18[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> + %42 = function.call @matMul_2::@matMul_2::@compute(%40, %41) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> + pod.write %21[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %21 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + } + %25 = cast.toindex %10 : !felt.type<"babybear"> + %26 = cast.toindex %0 : !felt.type<"babybear"> + %27 = array.read %arg1[%25, %26] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %30 = pod.read %29[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> + %31 = cast.toindex %10 : !felt.type<"babybear"> + array.write %30[%31, %c0] = %27 : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + %33 = array.read %array_0[%32] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + pod.write %33[@b] = %30 : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> + %34 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%34] = %33 : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %35 = cast.toindex %0 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@count] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %36[@count] = %38 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %33[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %41 = pod.read %33[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> + %42 = function.call @matMul_2::@matMul_2::@compute(%40, %41) : (!array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_2::@matMul_2<[]>> + pod.write %36[@comp] = %42 : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> + %43 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%43] = %36 : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + } + } + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> + %4 = struct.readm %3[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %5 = array.read %4[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %arg2[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <2 x !struct.type<@matMul_2::@matMul_2<[]>>> + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@matMul_2::@matMul_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_2::@matMul_2<[]>> + array.write %array_1[%arg3] = %1 : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> + } + struct.writem %self[@dot] = %array_1 : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> + struct.writem %self[@out] = %nondet : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@Dense_3::@Dense_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_3::@Dense_3<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>, %arg2: !array.type<3,2 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %0 = struct.readm %arg0[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@dot] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !struct.type<@matMul_2::@matMul_2<[]>>> + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>> + scf.for %arg4 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c3 step %c1 { + %13 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = array.read %arg1[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %3 : !felt.type<"babybear"> + %17 = array.read %2[%16] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %18 = pod.read %17[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %19 = cast.toindex %13 : !felt.type<"babybear"> + %20 = array.read %18[%c0, %19] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %13 : !felt.type<"babybear"> + %22 = cast.toindex %3 : !felt.type<"babybear"> + %23 = array.read %arg2[%21, %22] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %3 : !felt.type<"babybear"> + %25 = array.read %2[%24] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %26 = pod.read %25[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> + %27 = cast.toindex %13 : !felt.type<"babybear"> + %28 = array.read %26[%27, %c0] : <3,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %28, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> + %6 = struct.readm %5[@out] : <@matMul_2::@matMul_2<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %7 = array.read %6[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + %9 = array.read %arg3[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %0[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg4] : <2 x !struct.type<@matMul_2::@matMul_2<[]>>>, !struct.type<@matMul_2::@matMul_2<[]>> + %4 = array.read %2[%arg4] : <2 x !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<1,3 x !felt.type<"babybear">>, @b: !array.type<3,1 x !felt.type<"babybear">>]>, !array.type<3,1 x !felt.type<"babybear">> + function.call @matMul_2::@matMul_2::@constrain(%3, %5, %6) : (!struct.type<@matMul_2::@matMul_2<[]>>, !array.type<1,3 x !felt.type<"babybear">>, !array.type<3,1 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @matElemMul_4 { + struct.def @matElemMul_4 { + struct.member @out : !array.type<1,2 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,2 x !felt.type<"babybear">>, %arg1: !array.type<1,2 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_4::@matElemMul_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemMul_4::@matElemMul_4<[]>> + %nondet = llzk.nondet : !array.type<1,2 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%c0, %1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg1[%c0, %3] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%c0, %6] = %5 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@matElemMul_4::@matElemMul_4<[]>>, !array.type<1,2 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemMul_4::@matElemMul_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, %arg1: !array.type<1,2 x !felt.type<"babybear">>, %arg2: !array.type<1,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemMul_4::@matElemMul_4<[]>>, !array.type<1,2 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg1[%c0, %2] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg2[%c0, %4] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%c0, %7] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @matElemSum_5 { + struct.def @matElemSum_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<2 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<1,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@matElemSum_5::@matElemSum_5<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %4 { + %6 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %arg0[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %8 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %5 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } + scf.yield %felt_const_1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@sum] = %nondet : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@matElemSum_5::@matElemSum_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, %arg1: !array.type<1,2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sum] : <@matElemSum_5::@matElemSum_5<[]>>, !array.type<2 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %9 = array.read %1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = array.read %arg1[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %8 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8 : !felt.type<"babybear"> + } + scf.yield %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @matMul_6 { + struct.def @matMul_6 { + struct.member @out : !array.type<1,1 x !felt.type<"babybear">> {llzk.pub} + struct.member @matElemMulComp : !array.type<1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>> + struct.member @matElemMulComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>> + struct.member @matElemSumComp : !array.type<1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.member @matElemSumComp$inputs : !array.type<1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<1,2 x !felt.type<"babybear">>, %arg1: !array.type<2,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_6::@matMul_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@matMul_6::@matMul_6<[]>> + %nondet = llzk.nondet : !array.type<1,1 x !felt.type<"babybear">> + %array = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0, %c0] = %0 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c2 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0, %c0] = %1 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%6) + } do { + scf.for %arg2 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %10] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %15 : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %16 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %32 = function.call @matElemMul_4::@matElemMul_4::@compute(%30, %31) : (!array.type<1,2 x !felt.type<"babybear">>, !array.type<1,2 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_4::@matElemMul_4<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + array.write %array[%c0, %c0] = %16 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%c0, %24] = %21 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_0[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + array.write %array_0[%c0, %c0] = %25 : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %26 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %32 = function.call @matElemMul_4::@matElemMul_4::@compute(%30, %31) : (!array.type<1,2 x !felt.type<"babybear">>, !array.type<1,2 x !felt.type<"babybear">>) -> !struct.type<@matElemMul_4::@matElemMul_4<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + array.write %array[%c0, %c0] = %26 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + %12 = struct.readm %11[@out] : <@matElemMul_4::@matElemMul_4<[]>>, !array.type<1,2 x !felt.type<"babybear">> + %13 = cast.toindex %9 : !felt.type<"babybear"> + %14 = array.read %12[%c0, %13] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]> + %16 = pod.read %15[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %17 = cast.toindex %9 : !felt.type<"babybear"> + array.write %16[%c0, %17] = %14 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]> + pod.write %18[@a] = %16 : <[@a: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + array.write %array_2[%c0, %c0] = %18 : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]> + %19 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %18[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %24 = function.call @matElemSum_5::@matElemSum_5::@compute(%23) : (!array.type<1,2 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_5::@matElemSum_5<[]>> + pod.write %19[@comp] = %24 : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + array.write %array_1[%c0, %c0] = %19 : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + } + } + %6 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %8 = struct.readm %7[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0, %c0] = %8 : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@matElemMulComp$inputs] = %array_0 : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>> + %2 = array.read %array[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@matElemMul_4::@matElemMul_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + array.write %array_3[%c0, %c0] = %3 : <1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + struct.writem %self[@matElemMulComp] = %array_3 : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>> + struct.writem %self[@matElemSumComp$inputs] = %array_2 : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>> + %array_4 = array.new : <1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + %4 = array.read %array_1[%c0, %c0] : <1,1 x !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_5::@matElemSum_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + array.write %array_4[%c0, %c0] = %5 : <1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + struct.writem %self[@matElemSumComp] = %array_4 : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + struct.writem %self[@out] = %nondet : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !felt.type<"babybear">> + function.return %self : !struct.type<@matMul_6::@matMul_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@matMul_6::@matMul_6<[]>>, %arg1: !array.type<1,2 x !felt.type<"babybear">>, %arg2: !array.type<2,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@matElemMulComp] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>> + %2 = struct.readm %arg0[@matElemMulComp$inputs] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@matElemSumComp] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>> + %4 = struct.readm %arg0[@matElemSumComp$inputs] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + scf.for %arg3 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%c0, %16] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %19 = pod.read %18[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%c0, %20] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %arg2[%22, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %25 = pod.read %24[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%c0, %26] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + %17 = struct.readm %16[@out] : <@matElemMul_4::@matElemMul_4<[]>>, !array.type<1,2 x !felt.type<"babybear">> + %18 = cast.toindex %15 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]> + %21 = pod.read %20[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%c0, %22] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %13 = struct.readm %12[@out] : <@matElemSum_5::@matElemSum_5<[]>>, !felt.type<"babybear"> + %14 = array.read %0[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %5 = array.read %1[%c0, %c0] : <1,1 x !struct.type<@matElemMul_4::@matElemMul_4<[]>>>, !struct.type<@matElemMul_4::@matElemMul_4<[]>> + %6 = array.read %2[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]> + %7 = pod.read %6[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + function.call @matElemMul_4::@matElemMul_4::@constrain(%5, %7, %8) : (!struct.type<@matElemMul_4::@matElemMul_4<[]>>, !array.type<1,2 x !felt.type<"babybear">>, !array.type<1,2 x !felt.type<"babybear">>) -> () + %9 = array.read %3[%c0, %c0] : <1,1 x !struct.type<@matElemSum_5::@matElemSum_5<[]>>>, !struct.type<@matElemSum_5::@matElemSum_5<[]>> + %10 = array.read %4[%c0, %c0] : <1,1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>]> + %11 = pod.read %10[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + function.call @matElemSum_5::@matElemSum_5::@constrain(%9, %11) : (!struct.type<@matElemSum_5::@matElemSum_5<[]>>, !array.type<1,2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Dense_7 { + struct.def @Dense_7 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @dot : !array.type<1 x !struct.type<@matMul_6::@matMul_6<[]>>> + struct.member @dot$inputs : !array.type<1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<2,1 x !felt.type<"babybear">>, %arg2: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@Dense_7::@Dense_7<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + scf.for %arg3 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = cast.toindex %9 : !felt.type<"babybear"> + %11 = array.read %arg0[%10] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %13 = pod.read %12[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %14 = cast.toindex %9 : !felt.type<"babybear"> + array.write %13[%c0, %14] = %11 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + pod.write %15[@a] = %13 : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + array.write %array_0[%c0] = %15 : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %16 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %30 = pod.read %15[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %31 = pod.read %15[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> + %32 = function.call @matMul_6::@matMul_6::@compute(%30, %31) : (!array.type<1,2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_6::@matMul_6<[]>> + pod.write %16[@comp] = %32 : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_6::@matMul_6<[]>> + array.write %array[%c0] = %16 : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + } + %20 = cast.toindex %9 : !felt.type<"babybear"> + %21 = array.read %arg1[%20, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> + %24 = cast.toindex %9 : !felt.type<"babybear"> + array.write %23[%24, %c0] = %21 : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + pod.write %25[@b] = %23 : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> + array.write %array_0[%c0] = %25 : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %26 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %30 = pod.read %25[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %31 = pod.read %25[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> + %32 = function.call @matMul_6::@matMul_6::@compute(%30, %31) : (!array.type<1,2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>) -> !struct.type<@matMul_6::@matMul_6<[]>> + pod.write %26[@comp] = %32 : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_6::@matMul_6<[]>> + array.write %array[%c0] = %26 : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + } + } + %3 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_6::@matMul_6<[]>> + %5 = struct.readm %4[@out] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %6 = array.read %5[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %8 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@dot$inputs] = %array_0 : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1 x !struct.type<@matMul_6::@matMul_6<[]>>> + %1 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]> + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@matMul_6::@matMul_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@matMul_6::@matMul_6<[]>> + array.write %array_1[%c0] = %2 : <1 x !struct.type<@matMul_6::@matMul_6<[]>>>, !struct.type<@matMul_6::@matMul_6<[]>> + struct.writem %self[@dot] = %array_1 : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !struct.type<@matMul_6::@matMul_6<[]>>> + struct.writem %self[@out] = %nondet : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Dense_7::@Dense_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Dense_7::@Dense_7<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !array.type<2,1 x !felt.type<"babybear">>, %arg3: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@dot] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !struct.type<@matMul_6::@matMul_6<[]>>> + %2 = struct.readm %arg0[@dot$inputs] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>> + scf.while (%arg4 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %7 = bool.cmp lt(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%7) + } do { + scf.for %arg4 = %c0 to %c2 step %c1 { + %13 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %14 = cast.toindex %13 : !felt.type<"babybear"> + %15 = array.read %arg1[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = array.read %2[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %17 = pod.read %16[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %18 = cast.toindex %13 : !felt.type<"babybear"> + %19 = array.read %17[%c0, %18] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %13 : !felt.type<"babybear"> + %21 = array.read %arg2[%20, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %2[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %23 = pod.read %22[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> + %24 = cast.toindex %13 : !felt.type<"babybear"> + %25 = array.read %23[%24, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = array.read %1[%c0] : <1 x !struct.type<@matMul_6::@matMul_6<[]>>>, !struct.type<@matMul_6::@matMul_6<[]>> + %8 = struct.readm %7[@out] : <@matMul_6::@matMul_6<[]>>, !array.type<1,1 x !felt.type<"babybear">> + %9 = array.read %8[%c0, %c0] : <1,1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = array.read %arg3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %3 = array.read %1[%c0] : <1 x !struct.type<@matMul_6::@matMul_6<[]>>>, !struct.type<@matMul_6::@matMul_6<[]>> + %4 = array.read %2[%c0] : <1 x !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]> + %5 = pod.read %4[@a] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<1,2 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<1,2 x !felt.type<"babybear">>, @b: !array.type<2,1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> + function.call @matMul_6::@matMul_6::@constrain(%3, %5, %6) : (!struct.type<@matMul_6::@matMul_6<[]>>, !array.type<1,2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_8 { + struct.def @Num2Bits_8 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_9 { + struct.def @Num2Bits_9 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_10 { + struct.def @CompConstant_10 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_10::@CompConstant_10<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg2, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg2, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg4, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %40, %41, %38, %39 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#2 : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_9::@Num2Bits_9::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> + %20 = function.call @Num2Bits_9::@Num2Bits_9::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_10::@CompConstant_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_10::@CompConstant_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_10::@CompConstant_10<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_10::@CompConstant_10<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_10::@CompConstant_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_10::@CompConstant_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg4, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg5, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg2, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %41, %39, %40, %38 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_9::@Num2Bits_9::@constrain(%11, %17) : (!struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_10::@CompConstant_10<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_10::@CompConstant_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg5, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg2, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg4, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %30, %31, %28, %29 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#2 : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_9::@Num2Bits_9::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_10::@CompConstant_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_10::@CompConstant_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_10::@CompConstant_10<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_10::@CompConstant_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_10::@CompConstant_10<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_10::@CompConstant_10<[]>>, !struct.type<@Num2Bits_9::@Num2Bits_9<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_10::@CompConstant_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_1, %arg6 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg6, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %33, %31, %32, %30 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_9::@Num2Bits_9<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_9::@Num2Bits_9::@constrain(%3, %9) : (!struct.type<@Num2Bits_9::@Num2Bits_9<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sign_11 { + struct.def @Sign_11 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_10::@CompConstant_10<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_11::@Sign_11<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_11::@Sign_11<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@sign] : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@Sign_11::@Sign_11<[]>>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@Sign_11::@Sign_11<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %11 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @CompConstant_10::@CompConstant_10::@product(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_10::@CompConstant_10<[]>> + %24 = function.call @CompConstant_10::@CompConstant_10::@compute(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %4 : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_11::@Sign_11<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %5 : <@Sign_11::@Sign_11<[]>>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_10::@CompConstant_10::@constrain(%1, %7) : (!struct.type<@CompConstant_10::@CompConstant_10<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Sign_11::@Sign_11<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_11::@Sign_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_11::@Sign_11<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @CompConstant_10::@CompConstant_10::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %1 : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_11::@Sign_11<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_10::@CompConstant_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %2 : <@Sign_11::@Sign_11<[]>>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sign_11::@Sign_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_11::@Sign_11<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@Sign_11::@Sign_11<[]>>, !struct.type<@CompConstant_10::@CompConstant_10<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_11::@Sign_11<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@CompConstant_10::@CompConstant_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_10::@CompConstant_10::@constrain(%1, %4) : (!struct.type<@CompConstant_10::@CompConstant_10<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsPositive_12 { + struct.def @IsPositive_12 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @num2Bits : !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + struct.member @num2Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @sign : !struct.type<@Sign_11::@Sign_11<[]>> + struct.member @sign$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_12::@IsPositive_12<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_8::@Num2Bits_8::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + %20 = function.call @Num2Bits_8::@Num2Bits_8::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = struct.readm %self[@out] : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %self[@num2Bits] : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@num2Bits$inputs] : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = struct.readm %self[@sign] : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@sign$inputs] : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = pod.read %5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %20[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %23[%24] = %22 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %23 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %25 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %26 : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %35 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %36 = function.call @Sign_11::@Sign_11::@product(%35) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_11::@Sign_11<[]>> + %37 = function.call @Sign_11::@Sign_11::@compute(%35) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %36 : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %4[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %7[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + %10 = struct.readm %9[@sign] : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.sub %felt_const_1, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_0 : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %12 : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_2 : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %13 : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + %14 = struct.readm %6[@sign] : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_8::@Num2Bits_8::@constrain(%4, %16) : (!struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_11::@Sign_11::@constrain(%6, %17) : (!struct.type<@Sign_11::@Sign_11<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsPositive_12::@IsPositive_12<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsPositive_12::@IsPositive_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_8::@Num2Bits_8::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %13 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %16 : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %18 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @Sign_11::@Sign_11::@compute(%18) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + %4 = struct.readm %3[@sign] : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2Bits$inputs] = %pod_0 : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@num2Bits] = %6 : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@sign$inputs] = %pod_2 : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Sign_11::@Sign_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + struct.writem %self[@sign] = %7 : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsPositive_12::@IsPositive_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@num2Bits] : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@num2Bits$inputs] : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@sign] : <@IsPositive_12::@IsPositive_12<[]>>, !struct.type<@Sign_11::@Sign_11<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@sign$inputs] : <@IsPositive_12::@IsPositive_12<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %1[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %3[@sign] : <@Sign_11::@Sign_11<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_8::@Num2Bits_8::@constrain(%1, %8) : (!struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Sign_11::@Sign_11::@constrain(%3, %9) : (!struct.type<@Sign_11::@Sign_11<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ReLU_13 { + struct.def @ReLU_13 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isPositive : !struct.type<@IsPositive_12::@IsPositive_12<[]>> + struct.member @isPositive$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@ReLU_13::@ReLU_13<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %14 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = function.call @IsPositive_12::@IsPositive_12::@product(%14) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_12::@IsPositive_12<[]>> + %16 = function.call @IsPositive_12::@IsPositive_12::@compute(%14) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %arg0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isPositive$inputs] = %pod_0 : <@ReLU_13::@ReLU_13<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + struct.writem %self[@isPositive] = %6 : <@ReLU_13::@ReLU_13<[]>>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + %7 = struct.readm %self[@out] : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %self[@isPositive] : <@ReLU_13::@ReLU_13<[]>>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@isPositive$inputs] : <@ReLU_13::@ReLU_13<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %10 = pod.read %9[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %8[@out] : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %arg0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %9[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsPositive_12::@IsPositive_12::@constrain(%8, %13) : (!struct.type<@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@ReLU_13::@ReLU_13<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@ReLU_13::@ReLU_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %7 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = function.call @IsPositive_12::@IsPositive_12::@compute(%7) : (!felt.type<"babybear">) -> !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %8 : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %arg0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isPositive$inputs] = %pod_0 : <@ReLU_13::@ReLU_13<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsPositive_12::@IsPositive_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + struct.writem %self[@isPositive] = %6 : <@ReLU_13::@ReLU_13<[]>>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ReLU_13::@ReLU_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@ReLU_13::@ReLU_13<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %0 = struct.readm %arg0[@out] : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isPositive] : <@ReLU_13::@ReLU_13<[]>>, !struct.type<@IsPositive_12::@IsPositive_12<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isPositive$inputs] : <@ReLU_13::@ReLU_13<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %1[@out] : <@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsPositive_12::@IsPositive_12::@constrain(%1, %6) : (!struct.type<@IsPositive_12::@IsPositive_12<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @model1_14 { + struct.def @model1_14 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @Dense21 : !struct.type<@Dense_7::@Dense_7<[]>> + struct.member @Dense21$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> + struct.member @Dense32 : !struct.type<@Dense_3::@Dense_3<[]>> + struct.member @Dense32$inputs : !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> + struct.member @relu : !array.type<2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> + struct.member @relu$inputs : !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>, %arg2: !array.type<2,1 x !felt.type<"babybear">>) -> !struct.type<@model1_14::@model1_14<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@model1_14::@model1_14<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %26[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %29 : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %32 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %34 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @Dense_3::@Dense_3::@compute(%34, %35, %36) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %37 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %34 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg1[%35, %36] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39, %40] = %37 : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@weights] = %38 : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %42 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %44 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %46 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = function.call @Dense_3::@Dense_3::@compute(%44, %45, %46) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %47 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@bias] = %27 : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %30 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @Dense_3::@Dense_3::@compute(%32, %33, %34) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %35 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + %28 = struct.readm %27[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %28[%29] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_3[%31] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@in] = %30 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%33] = %32 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %34 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%34] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %40 = function.call @ReLU_13::@ReLU_13::@product(%39) : (!felt.type<"babybear">) -> !struct.type<@ReLU_13::@ReLU_13<[]>> + %41 = function.call @ReLU_13::@ReLU_13::@compute(%39) : (!felt.type<"babybear">) -> !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + pod.write %35[@comp] = %40 : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + %42 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%42] = %35 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array[%27] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + array.write %31[%32] = %30 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %31 : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %34 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %43 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %46 = function.call @Dense_7::@Dense_7::@compute(%43, %44, %45) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %46 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg2[%36, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39, %c0] = %37 : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@weights] = %38 : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %41 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %46 = function.call @Dense_7::@Dense_7::@compute(%43, %44, %45) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %46 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@bias] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @Dense_7::@Dense_7::@compute(%26, %27, %28) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %29 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@model1_14::@model1_14<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@Dense21$inputs] = %pod_0 : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + struct.writem %self[@Dense21] = %7 : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + struct.writem %self[@relu$inputs] = %array_3 : <@model1_14::@model1_14<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_4 = array.new : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@comp] : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + array.write %array_4[%arg3] = %27 : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu] = %array_4 : <@model1_14::@model1_14<[]>>, !array.type<2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> {product_source = "compute"} + struct.writem %self[@Dense32$inputs] = %pod_2 : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + struct.writem %self[@Dense32] = %8 : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@model1_14::@model1_14<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@Dense21] : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@Dense21$inputs] : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = struct.readm %self[@Dense32] : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@Dense32$inputs] : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = struct.readm %self[@relu] : <@model1_14::@model1_14<[]>>, !array.type<2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> {product_source = "constrain"} + %15 = struct.readm %self[@relu$inputs] : <@model1_14::@model1_14<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %13[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %32 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %arg1[%33, %34] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = pod.read %13[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %36[%37, %38] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %13[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = struct.readm %12[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %15[%30] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %14[%27] : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg2[%33, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = pod.read %11[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = pod.read %11[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %10[@out] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = pod.read %11[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = pod.read %11[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_7::@Dense_7::@constrain(%10, %20, %21, %22) : (!struct.type<@Dense_7::@Dense_7<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %26 = array.read %14[%arg3] : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "constrain"} + %27 = array.read %15[%arg3] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_13::@ReLU_13::@constrain(%26, %28) : (!struct.type<@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %23 = pod.read %13[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = pod.read %13[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = pod.read %13[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_3::@Dense_3::@constrain(%12, %23, %24, %25) : (!struct.type<@Dense_3::@Dense_3<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@model1_14::@model1_14<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3,2 x !felt.type<"babybear">>, %arg2: !array.type<2,1 x !felt.type<"babybear">>) -> !struct.type<@model1_14::@model1_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@model1_14::@model1_14<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %9 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c1 : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3] = %9 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %12 : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %15 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @Dense_3::@Dense_3::@compute(%17, %18, %19) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %20 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %17 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg1[%18, %19] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22, %23] = %20 : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@weights] = %21 : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %25 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Dense_3::@Dense_3::@compute(%27, %28, %29) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %30 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %10[%11] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@bias] = %10 : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %13 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %15 = pod.read %pod_2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_2[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_2[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = function.call @Dense_3::@Dense_3::@compute(%15, %16, %17) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %18 : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_3[%14] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %15[@in] = %13 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%16] = %15 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %17 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %array[%17] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %15[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @ReLU_13::@ReLU_13::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + pod.write %18[@comp] = %23 : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%24] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array[%10] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %14 : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @Dense_7::@Dense_7::@compute(%26, %27, %28) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %29 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg2[%19, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22, %c0] = %20 : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@weights] = %21 : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %24 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @Dense_7::@Dense_7::@compute(%26, %27, %28) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %29 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@bias] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_0[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_0[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @Dense_7::@Dense_7::@compute(%9, %10, %11) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@model1_14::@model1_14<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@Dense21$inputs] = %pod_0 : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Dense_7::@Dense_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + struct.writem %self[@Dense21] = %7 : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "compute"} + struct.writem %self[@relu$inputs] = %array_3 : <@model1_14::@model1_14<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_4 = array.new : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %9 = array.read %array[%arg3] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@ReLU_13::@ReLU_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + array.write %array_4[%arg3] = %10 : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@relu] = %array_4 : <@model1_14::@model1_14<[]>>, !array.type<2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> {product_source = "compute"} + struct.writem %self[@Dense32$inputs] = %pod_2 : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Dense_3::@Dense_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + struct.writem %self[@Dense32] = %8 : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@model1_14::@model1_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@model1_14::@model1_14<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>, %arg2: !array.type<3,2 x !felt.type<"babybear">>, %arg3: !array.type<2,1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@model1_14::@model1_14<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@Dense21] : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_7::@Dense_7<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@Dense21$inputs] : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@Dense32] : <@model1_14::@model1_14<[]>>, !struct.type<@Dense_3::@Dense_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@Dense32$inputs] : <@model1_14::@model1_14<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@relu] : <@model1_14::@model1_14<[]>>, !array.type<2 x !struct.type<@ReLU_13::@ReLU_13<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@relu$inputs] : <@model1_14::@model1_14<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %17 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg1[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %4[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %23 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg2[%24, %25] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %4[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %27[%28, %29] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %17 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %4[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %17 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %3[@out] : <@Dense_3::@Dense_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %6[%21] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %17 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %5[%18] : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "constrain"} + %20 = struct.readm %19[@out] : <@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %arg3[%24, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %2[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27, %c0] : <2,1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@Dense_7::@Dense_7<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = array.read %9[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %2[@weights] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<2,1 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = pod.read %2[@bias] : <[@in: !array.type<2 x !felt.type<"babybear">>, @weights: !array.type<2,1 x !felt.type<"babybear">>, @bias: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_7::@Dense_7::@constrain(%1, %11, %12, %13) : (!struct.type<@Dense_7::@Dense_7<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2,1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %17 = array.read %5[%arg4] : <2 x !struct.type<@ReLU_13::@ReLU_13<[]>>>, !struct.type<@ReLU_13::@ReLU_13<[]>> {product_source = "constrain"} + %18 = array.read %6[%arg4] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ReLU_13::@ReLU_13::@constrain(%17, %19) : (!struct.type<@ReLU_13::@ReLU_13<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = pod.read %4[@weights] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = pod.read %4[@bias] : <[@in: !array.type<3 x !felt.type<"babybear">>, @weights: !array.type<3,2 x !felt.type<"babybear">>, @bias: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Dense_3::@Dense_3::@constrain(%3, %14, %15, %16) : (!struct.type<@Dense_3::@Dense_3<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3,2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/montgomery2edwards.llzk b/examples/circom-demo/montgomery2edwards.llzk new file mode 100644 index 0000000..eb39568 --- /dev/null +++ b/examples/circom-demo/montgomery2edwards.llzk @@ -0,0 +1,78 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>>} { + poly.template @Montgomery2Edwards_0 { + struct.def @Montgomery2Edwards_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.div %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.div %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %17, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.div %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.div %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Montgomery2Edwards_0::@Montgomery2Edwards_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/montgomeryadd.llzk b/examples/circom-demo/montgomeryadd.llzk new file mode 100644 index 0000000..0e80a2c --- /dev/null +++ b/examples/circom-demo/montgomeryadd.llzk @@ -0,0 +1,136 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>} { + poly.template @MontgomeryAdd_0 { + struct.def @MontgomeryAdd_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @lamda : !felt.type<"babybear"> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MontgomeryAdd_0::@MontgomeryAdd_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_168698 = felt.const 168698 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.div %2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lamda] = %6 : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.sub %8, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %6, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.sub %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %20 = struct.readm %self[@out] : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = struct.readm %self[@lamda] : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.sub %22, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.mul %21, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.sub %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.mul %29, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %30, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.sub %31, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.sub %33, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %20[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %20[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %37, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %21, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@MontgomeryAdd_0::@MontgomeryAdd_0<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MontgomeryAdd_0::@MontgomeryAdd_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_168698 = felt.const 168698 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.div %2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lamda] = %6 : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.sub %8, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %6, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.sub %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MontgomeryAdd_0::@MontgomeryAdd_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_168698 = felt.const 168698 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@lamda] : <@MontgomeryAdd_0::@MontgomeryAdd_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.sub %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.sub %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %9, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.sub %10, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %1, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/montgomerydouble.llzk b/examples/circom-demo/montgomerydouble.llzk new file mode 100644 index 0000000..9a4cc9b --- /dev/null +++ b/examples/circom-demo/montgomerydouble.llzk @@ -0,0 +1,164 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>} { + poly.template @MontgomeryDouble_0 { + struct.def @MontgomeryDouble_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @lamda : !felt.type<"babybear"> + struct.member @x1_2 : !felt.type<"babybear"> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MontgomeryDouble_0::@MontgomeryDouble_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_337396 = felt.const 337396 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_168698 = felt.const 168698 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@x1_2] = %2 : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_337396 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.div %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lamda] = %10 : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %12, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.mul %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %16 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.sub %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %10, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.sub %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = struct.readm %self[@out] : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = struct.readm %self[@lamda] : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = struct.readm %self[@x1_2] : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.mul %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.mul %29, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.mul %24, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.mul %25, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = felt.mul %33, %felt_const_337396 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %32, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.add %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %38, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %39, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %23[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %23[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.sub %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %24, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.sub %47, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %23[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@MontgomeryDouble_0::@MontgomeryDouble_0<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MontgomeryDouble_0::@MontgomeryDouble_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_337396 = felt.const 337396 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_168698 = felt.const 168698 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@x1_2] = %2 : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_337396 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.div %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lamda] = %10 : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %12, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.mul %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %16 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.sub %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %10, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.sub %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@MontgomeryDouble_0::@MontgomeryDouble_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_337396 = felt.const 337396 : <"babybear"> {product_source = "constrain"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_168698 = felt.const 168698 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@lamda] : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %arg0[@x1_2] : <@MontgomeryDouble_0::@MontgomeryDouble_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %2, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_337396 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %14, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_168698 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %17, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %16, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.sub %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.mul %1, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.sub %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mul_test.llzk b/examples/circom-demo/mul_test.llzk new file mode 100644 index 0000000..7812dc6 --- /dev/null +++ b/examples/circom-demo/mul_test.llzk @@ -0,0 +1,2687 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Mul_1::@Mul_1<[]>>} { + poly.template @XOR_0 { + struct.def @XOR_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_0::@XOR_0<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_0::@XOR_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_0::@XOR_0<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Mul_1 { + struct.def @Mul_1 { + struct.member @out : !array.type<128 x !felt.type<"babybear">> {llzk.pub} + struct.member @xor_1 : !array.type<64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> + struct.member @xor_1$inputs : !array.type<64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Mul_1::@Mul_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_63 = felt.const 63 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@Mul_1::@Mul_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c64 step %c1 { + %5 = array.read %array[%arg2, %arg3, %arg4] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3, %arg4] = %5 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_1 = llzk.nondet : !array.type<2,64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_2 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_2[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_1[%c0] = %nondet_2 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_1[%c1] = %nondet_2 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_3[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_4[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %11, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %16, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%18] = %15 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.sub %20, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %arg1[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%26] = %23 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c0, %6] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c1, %7] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_1 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %nondet_12 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_12[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %nondet_3[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_4[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %11, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_12[%15] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet_1[%c1, %16] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_0[%18, %c0, %19] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %20[@a] = %17 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%21, %c0, %22] = %20 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array[%23, %c0, %24] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %48 = pod.read %20[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %20[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = function.call @XOR_0::@XOR_0::@compute(%48, %49) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %25[@comp] = %50 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%51, %c0, %52] = %25 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet_12[%29] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%31, %c0, %32] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %33[@b] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34, %c0, %35] = %33 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %36 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array[%36, %c0, %37] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.subi %39, %c1 {product_source = "compute"} : index + pod.write %38[@count] = %40 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.cmpi eq, %40, %c0 {product_source = "compute"} : index + scf.if %41 { + %48 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = function.call @XOR_0::@XOR_0::@compute(%48, %49) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %38[@comp] = %50 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %51 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%51, %c0, %52] = %38 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %42 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%42, %c0, %43] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c1, %47] = %46 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c63 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %nondet_1[%c0, %11] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c0, %13] = %12 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + array.write %nondet_1[%c0, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_13 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_13[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %nondet_5[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %nondet_1[%c1, %c0] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%14] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet_1[%c0, %15] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%17, %c1, %18] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%20, %c1, %21] = %19 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %22 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%22, %c1, %23] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %47 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @XOR_0::@XOR_0::@compute(%47, %48) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %24[@comp] = %49 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %50 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%50, %c1, %51] = %24 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %nondet_13[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%30, %c1, %31] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33, %c1, %34] = %32 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %35 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%35, %c1, %36] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %47 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @XOR_0::@XOR_0::@compute(%47, %48) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %37[@comp] = %49 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %50 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%50, %c1, %51] = %37 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %41 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array[%41, %c1, %42] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c0, %46] = %45 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_63 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_63) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_1[%c1, %12] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c1, %14] = %13 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + array.write %nondet_1[%c1, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %0 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = bool.cmp lt(%10, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %14 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%14) {product_source = "compute"} %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %15, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %16, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %nondet_1[%14, %18] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %5, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.add %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%24] = %19 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %25 : !felt.type<"babybear"> + } attributes {product_source = "compute"} + %13 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %12 : !felt.type<"babybear"> + } + scf.yield %9 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_0 : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c64 step %c1 { + %5 = array.read %array[%arg2, %arg3, %arg4] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_6[%arg2, %arg3, %arg4] = %6 : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_6 : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Mul_1::@Mul_1<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@Mul_1::@Mul_1<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %self[@xor_1] : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %3 = struct.readm %self[@xor_1$inputs] : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet_7 = llzk.nondet : !array.type<2,64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_8 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_8[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_8[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_7[%c0] = %nondet_8 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_7[%c1] = %nondet_8 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_9 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_9[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_10 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_10[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %11, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %16, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_9[%18] = %15 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.add %19, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.sub %20, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.mul %5, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %24, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%26] = %23 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + %nondet_11 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_11[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_7[%c0, %6] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_7[%c1, %7] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + array.write %nondet_11[%c63] = %felt_const_1 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_12 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_12[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %nondet_9[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %nondet_10[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %11, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%15] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %nondet_7[%c1, %16] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %3[%18, %c0, %19] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %21 = pod.read %20[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %nondet_12[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %3[%24, %c0, %25] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %27 = pod.read %26[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %2[%28, %c0, %29] : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %31 = struct.readm %30[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_7[%c1, %32] = %31 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c63 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %nondet_7[%c0, %11] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_7[%c0, %13] = %12 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + array.write %nondet_7[%c0, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_13 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_13[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %nondet_11[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %nondet_7[%c1, %c0] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%14] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %nondet_7[%c0, %15] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%17, %c1, %18] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %nondet_13[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %3[%23, %c1, %24] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %2[%27, %c1, %28] : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_7[%c0, %31] = %30 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_63 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %6 to %7 step %8 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_63) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %nondet_7[%c1, %12] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_7[%c1, %14] = %13 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + array.write %nondet_7[%c1, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %11 = bool.cmp lt(%10, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %14 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%14) {product_source = "constrain"} %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.sub %16, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %nondet_7[%14, %18] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %5, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %1[%24] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %26 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %13 = felt.add %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %12 : !felt.type<"babybear"> + } + scf.yield %9 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c64 step %c1 { + %5 = array.read %2[%arg2, %arg3, %arg4] : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %6 = array.read %3[%arg2, %arg3, %arg4] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %6[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%5, %7, %8) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Mul_1::@Mul_1<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Mul_1::@Mul_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_63 = felt.const 63 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@Mul_1::@Mul_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c64 step %c1 { + %1 = array.read %array[%arg2, %arg3, %arg4] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %1[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3, %arg4] = %1 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %nondet_1 = llzk.nondet : !array.type<2,64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_2 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_2[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_1[%c0] = %nondet_2 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_1[%c1] = %nondet_2 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_3[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_4[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %3 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %2 to %3 step %4 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp lt(%5, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %7, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.sub %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%14] = %11 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %15, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %16, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg1[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %20, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_4[%22] = %19 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c0, %2] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c1, %3] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + array.write %nondet_5[%c63] = %felt_const_1 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_3[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet_4[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%11] = %10 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_1[%c1, %12] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_0[%14, %c0, %15] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %16[@a] = %13 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%17, %c0, %18] = %16 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %19 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array[%19, %c0, %20] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %22 = pod.read %21[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %21[@count] = %23 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %44 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @XOR_0::@XOR_0::@compute(%44, %45) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %21[@comp] = %46 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%47, %c0, %48] = %21 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %25 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %nondet_7[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_0[%27, %c0, %28] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %29[@b] = %26 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%30, %c0, %31] = %29 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %32 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array[%32, %c0, %33] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %44 = pod.read %29[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = pod.read %29[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @XOR_0::@XOR_0::@compute(%44, %45) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %34[@comp] = %46 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%47, %c0, %48] = %34 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%38, %c0, %39] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %42 = struct.readm %41[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c1, %43] = %42 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c63 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_1[%c0, %7] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c0, %9] = %8 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + array.write %nondet_1[%c0, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_8 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_8[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_1[%c1, %c0] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_8[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %nondet_1[%c0, %11] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array_0[%13, %c1, %14] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %15[@a] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%16, %c1, %17] = %15 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %18 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%18, %c1, %19] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %43 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = function.call @XOR_0::@XOR_0::@compute(%43, %44) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %20[@comp] = %45 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46, %c1, %47] = %20 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %nondet_8[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%26, %c1, %27] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %28[@b] = %25 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%29, %c1, %30] = %28 : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %31 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array[%31, %c1, %32] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %34 = pod.read %33[@count] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %33[@count] = %35 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %43 = pod.read %28[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %28[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = function.call @XOR_0::@XOR_0::@compute(%43, %44) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + pod.write %33[@comp] = %45 : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %46 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46, %c1, %47] = %33 : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %37 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%37, %c1, %38] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c0, %42] = %41 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %2 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %3 = cast.toindex %felt_const_63 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %2 to %3 step %4 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp lt(%5, %felt_const_63) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet_1[%c1, %8] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%c1, %10] = %9 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + array.write %nondet_1[%c1, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %0 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %3 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %5 = scf.for %arg4 = %2 to %3 step %4 iter_args(%arg5 = %arg3) -> (!felt.type<"babybear">) { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = bool.cmp lt(%6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %10 = bool.cmp lt(%arg6, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%10) {product_source = "compute"} %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %6, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %11, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.sub %12, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %nondet_1[%10, %14] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.mul %6, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %18, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%20] = %15 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %21 : !felt.type<"babybear"> + } attributes {product_source = "compute"} + %9 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %8 : !felt.type<"babybear"> + } + scf.yield %5 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@xor_1$inputs] = %array_0 : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_6 = array.new : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c64 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + scf.for %arg4 = %c0 to %c64 step %c1 { + %1 = array.read %array[%arg2, %arg3, %arg4] : <64,2,64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@XOR_0::@XOR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + array.write %array_6[%arg2, %arg3, %arg4] = %2 : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@xor_1] = %array_6 : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Mul_1::@Mul_1<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Mul_1::@Mul_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mul_1::@Mul_1<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c64 = arith.constant {product_source = "constrain"} 64 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_63 = felt.const 63 : <"babybear"> {product_source = "constrain"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Mul_1::@Mul_1<[]>>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@xor_1] : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@xor_1$inputs] : <@Mul_1::@Mul_1<[]>>, !array.type<64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<2,64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c1] = %nondet_0 : <2,64 x !felt.type<"babybear">>, <64 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_2[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %6 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %5 to %6 step %7 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp lt(%8, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %4, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %10, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.sub %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %4, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%17] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %4, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %18, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.sub %19, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg2[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.mul %4, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.add %23, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%25] = %22 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + %nondet_3 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_3[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0, %5] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1, %6] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + array.write %nondet_3[%c63] = %felt_const_1 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_4 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_4[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c64 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %nondet_1[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %nondet_2[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.mul %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_4[%14] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %nondet[%c1, %15] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%17, %c0, %18] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %nondet_4[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%23, %c0, %24] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%27, %c0, %28] : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %30 = struct.readm %29[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1, %31] = %30 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c63 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %nondet[%c0, %10] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0, %12] = %11 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + array.write %nondet[%c0, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_5 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_5[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c1] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c4] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c5] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c6] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c8] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c9] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c10] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c11] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c12] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c13] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c14] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c15] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c16] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c17] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c18] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c19] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c20] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c21] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c22] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c23] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c24] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c25] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c26] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c27] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c28] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c29] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c30] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c31] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c32] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c33] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c34] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c35] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c36] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c37] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c38] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c39] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c40] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c41] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c42] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c43] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c44] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c45] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c46] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c47] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c48] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c49] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c50] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c51] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c52] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c53] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c54] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c55] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c56] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c57] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c58] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c59] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c60] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c61] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c62] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%c63] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c64 step %c1 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %nondet_3[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %nondet[%c1, %c0] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %10, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_5[%13] = %12 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %nondet[%c0, %14] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%16, %c1, %17] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %nondet_5[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %2[%22, %c1, %23] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %25 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %1[%26, %c1, %27] : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@XOR_0::@XOR_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c0, %30] = %29 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %6 = cast.toindex %felt_const_63 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %5 to %6 step %7 { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp lt(%8, %felt_const_63) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %nondet[%c1, %11] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1, %13] = %12 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + array.write %nondet[%c1, %c63] = %felt_const_0 : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = scf.for %arg3 = %c0 to %c2 step %c1 iter_args(%arg4 = %felt_const_0) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %6 = cast.toindex %felt_const_8 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %8 = scf.for %arg5 = %5 to %6 step %7 iter_args(%arg6 = %arg4) -> (!felt.type<"babybear">) { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = scf.while (%arg7 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %13 = bool.cmp lt(%arg7, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%13) {product_source = "constrain"} %arg7 : !felt.type<"babybear"> + } do { + ^bb0(%arg7: !felt.type<"babybear">): + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %nondet[%13, %17] : <2,64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %4, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %arg7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %0[%23] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %arg7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %25 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %12 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %11 : !felt.type<"babybear"> + } + scf.yield %8 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c64 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + scf.for %arg5 = %c0 to %c64 step %c1 { + %4 = array.read %1[%arg3, %arg4, %arg5] : <64,2,64 x !struct.type<@XOR_0::@XOR_0<[]>>>, !struct.type<@XOR_0::@XOR_0<[]>> {product_source = "constrain"} + %5 = array.read %2[%arg3, %arg4, %arg5] : <64,2,64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = pod.read %5[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %5[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @XOR_0::@XOR_0::@constrain(%4, %6, %7) : (!struct.type<@XOR_0::@XOR_0<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mux1_1.llzk b/examples/circom-demo/mux1_1.llzk new file mode 100644 index 0000000..62bd2f5 --- /dev/null +++ b/examples/circom-demo/mux1_1.llzk @@ -0,0 +1,450 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Main_4::@Main_4<[]>>} { + poly.template @MultiMux1_0 { + struct.def @MultiMux1_0 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux1_0::@MultiMux1_0<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %arg0[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.add %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %5 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@MultiMux1_0::@MultiMux1_0<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, %arg1: !array.type<1,2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux1_0::@MultiMux1_0<[]>>, !array.type<1 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %arg1[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux1_1 { + struct.def @Mux1_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@Mux1_1::@Mux1_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@Mux1_1::@Mux1_1<[]>> + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + scf.for %arg2 = %c0 to %c2 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg0[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + array.write %10[%c0, %11] = %9 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %10 : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.subi %12, %c1 : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.cmpi eq, %13, %c0 : index + scf.if %14 { + %15 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %16 = pod.read %pod_0[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = function.call @MultiMux1_0::@MultiMux1_0::@compute(%15, %16) : (!array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + pod.write %pod[@comp] = %17 : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + } + } + pod.write %pod_0[@s] = %arg1 : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %8 = pod.read %pod_0[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @MultiMux1_0::@MultiMux1_0::@compute(%7, %8) : (!array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + %4 = struct.readm %3[@out] : <@MultiMux1_0::@MultiMux1_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@Mux1_1::@Mux1_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux1_1::@Mux1_1<[]>>, !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + struct.writem %self[@mux] = %6 : <@Mux1_1::@Mux1_1<[]>>, !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + function.return %self : !struct.type<@Mux1_1::@Mux1_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux1_1::@Mux1_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux1_1::@Mux1_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux1_1::@Mux1_1<[]>>, !struct.type<@MultiMux1_0::@MultiMux1_0<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux1_1::@Mux1_1<[]>>, !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + scf.for %arg3 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %2[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %11[%c0, %12] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = pod.read %2[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = struct.readm %1[@out] : <@MultiMux1_0::@MultiMux1_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %7 = pod.read %2[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @MultiMux1_0::@MultiMux1_0::@constrain(%1, %6, %7) : (!struct.type<@MultiMux1_0::@MultiMux1_0<[]>>, !array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + scf.while (%arg1 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = felt.shr %arg0, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.bit_and %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %2 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%2) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %2 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.sub %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %7, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Constants_3 { + struct.def @Constants_3 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_37 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_47 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @compute() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_37 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_47 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Constants_3::@Constants_3<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "constrain"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Main_4 { + struct.def @Main_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@Mux1_1::@Mux1_1<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @cst : !struct.type<@Constants_3::@Constants_3<[]>> + struct.member @cst$inputs : !pod.type<[]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@product() : () -> !struct.type<@Constants_3::@Constants_3<[]>> + %1 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_4 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %31 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%31) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %7 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %31 = pod.read %pod_0[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_0[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @Mux1_1::@Mux1_1::@compute(%31, %32) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %33 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = struct.readm %self[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %self[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %14 = struct.readm %self[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %16 = struct.readm %self[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %17 = struct.readm %self[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %18 = pod.read %15[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = struct.readm %14[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %13[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %31 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %33 = struct.readm %32[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %33[%34] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_0[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %36 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %39 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %48 = pod.read %pod_0[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_0[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = function.call @Mux1_1::@Mux1_1::@compute(%48, %49) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %50 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %41 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %42 = struct.readm %16[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %42[%43] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %13[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %41 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %22 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + %23 = struct.readm %22[@out] : <@Mux1_1::@Mux1_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %23 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %24 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %25 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %25 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %26 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + %27 = struct.readm %12[@out] : <@Mux1_1::@Mux1_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %15[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%14, %28) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%16) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + %29 = pod.read %13[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = pod.read %13[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Mux1_1::@Mux1_1::@constrain(%12, %29, %30) : (!struct.type<@Mux1_1::@Mux1_1<[]>>, !array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_4 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %15 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%15) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %16 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %6 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %15 = pod.read %pod_0[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_0[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %17 = function.call @Mux1_1::@Mux1_1::@compute(%15, %16) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %17 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %17[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_0[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %20 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %23 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_0[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_0[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = function.call @Mux1_1::@Mux1_1::@compute(%25, %26) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Mux1_1::@Mux1_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %12 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %13 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %13 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux1_1::@Mux1_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %14 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Main_4::@Main_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux1_1::@Mux1_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = struct.readm %arg0[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %5[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = struct.readm %1[@out] : <@Mux1_1::@Mux1_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%3, %12) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%5) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + %13 = pod.read %2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = pod.read %2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Mux1_1::@Mux1_1::@constrain(%1, %13, %14) : (!struct.type<@Mux1_1::@Mux1_1<[]>>, !array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mux2_1.llzk b/examples/circom-demo/mux2_1.llzk new file mode 100644 index 0000000..a6cf011 --- /dev/null +++ b/examples/circom-demo/mux2_1.llzk @@ -0,0 +1,612 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Main_4::@Main_4<[]>>} { + poly.template @MultiMux2_0 { + struct.def @MultiMux2_0 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux2_0::@MultiMux2_0<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux2_0::@MultiMux2_0<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + %3 = array.read %arg0[%c0, %c3] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %arg0[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %9, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %10 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %15 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.mul %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %20 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %21 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.add %22, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %28 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a10] = %nondet_2 : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet_0 : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_1 : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_3 : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, %arg1: !array.type<1,4 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a10] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a1] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a0] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@s10] : <@MultiMux2_0::@MultiMux2_0<[]>>, !felt.type<"babybear"> + %6 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + %9 = array.read %arg1[%c0, %c3] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = array.read %arg1[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %arg1[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %15, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg1[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg1[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.sub %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.add %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %39, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux2_1 { + struct.def @Mux2_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_1::@Mux2_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c6 = arith.constant 6 : index + %self = struct.new : <@Mux2_1::@Mux2_1<[]>> + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %14 = function.call @MultiMux2_0::@MultiMux2_0::@compute(%12, %13) : (!array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + } + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %14 = function.call @MultiMux2_0::@MultiMux2_0::@compute(%12, %13) : (!array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + %1 = struct.readm %0[@out] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux2_1::@Mux2_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux2_1::@Mux2_1<[]>>, !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + struct.writem %self[@mux] = %3 : <@Mux2_1::@Mux2_1<[]>>, !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + function.return %self : !struct.type<@Mux2_1::@Mux2_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux2_1::@Mux2_1<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux2_1::@Mux2_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux2_1::@Mux2_1<[]>>, !struct.type<@MultiMux2_0::@MultiMux2_0<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux2_1::@Mux2_1<[]>>, !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @MultiMux2_0::@MultiMux2_0::@constrain(%1, %5, %6) : (!struct.type<@MultiMux2_0::@MultiMux2_0<[]>>, !array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<2 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Constants_3 { + struct.def @Constants_3 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_71 = felt.const 71 : <"babybear"> {product_source = "compute"} + %felt_const_53 = felt.const 53 : <"babybear"> {product_source = "compute"} + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_37 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_47 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_53 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_71 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %0[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @compute() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_71 = felt.const 71 : <"babybear"> {product_source = "compute"} + %felt_const_53 = felt.const 53 : <"babybear"> {product_source = "compute"} + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_37 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_47 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_53 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_71 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Constants_3::@Constants_3<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_71 = felt.const 71 : <"babybear"> {product_source = "constrain"} + %felt_const_53 = felt.const 53 : <"babybear"> {product_source = "constrain"} + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "constrain"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %0[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Main_4 { + struct.def @Main_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@Mux2_1::@Mux2_1<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @cst : !struct.type<@Constants_3::@Constants_3<[]>> + struct.member @cst$inputs : !pod.type<[]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@product() : () -> !struct.type<@Constants_3::@Constants_3<[]>> + %1 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_4 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %22 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %24[%25] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_0[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %26 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %27 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_0[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_0[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Mux2_1::@Mux2_1::@compute(%32, %33) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %24[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_0[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %26 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %27 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_0[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_0[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Mux2_1::@Mux2_1::@compute(%32, %33) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Mux2_1::@Mux2_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %7 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %8 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %9 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %9 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %10 = struct.readm %self[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = struct.readm %self[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %17 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %13[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %12[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %15[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %12[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %18 = struct.readm %11[@out] : <@Mux2_1::@Mux2_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %12[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = pod.read %12[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux2_1::@Mux2_1::@constrain(%11, %19, %20) : (!struct.type<@Mux2_1::@Mux2_1<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %21 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%13, %21) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%15) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_4 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %9 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %10 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %14 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_0[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @Mux2_1::@Mux2_1::@compute(%19, %20) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %21 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %14 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_0[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @Mux2_1::@Mux2_1::@compute(%19, %20) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %21 : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Mux2_1::@Mux2_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux2_1::@Mux2_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %6 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %7 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %8 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %8 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Main_4::@Main_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux2_1::@Mux2_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = struct.readm %arg0[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %5[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Mux2_1::@Mux2_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %2[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %2[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux2_1::@Mux2_1::@constrain(%1, %9, %10) : (!struct.type<@Mux2_1::@Mux2_1<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%3, %11) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%5) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mux3_1.llzk b/examples/circom-demo/mux3_1.llzk new file mode 100644 index 0000000..ed2f8fa --- /dev/null +++ b/examples/circom-demo/mux3_1.llzk @@ -0,0 +1,790 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Main_4::@Main_4<[]>>} { + poly.template @MultiMux3_0 { + struct.def @MultiMux3_0 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a210 : !array.type<1 x !felt.type<"babybear">> + struct.member @a21 : !array.type<1 x !felt.type<"babybear">> + struct.member @a20 : !array.type<1 x !felt.type<"babybear">> + struct.member @a2 : !array.type<1 x !felt.type<"babybear">> + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,8 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux3_0::@MultiMux3_0<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_4 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_6 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_7 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux3_0::@MultiMux3_0<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + %3 = array.read %arg0[%c0, %c7] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %arg0[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = array.read %arg0[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.mul %17, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_5[%c0] = %18 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %arg0[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.sub %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.sub %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %27 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = array.read %arg0[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.sub %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.add %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.mul %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %36 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = felt.sub %37, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %39 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = array.read %arg0[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = felt.mul %46, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_6[%c0] = %47 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.mul %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %52 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %53 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = felt.sub %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = felt.mul %55, %56 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %57 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_7[%c0] = %58 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %59 = array.read %nondet_5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %61 = felt.add %59, %60 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %nondet_3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %63 = felt.add %61, %62 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.add %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.mul %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %nondet_6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %69 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = felt.add %68, %69 : !felt.type<"babybear">, !felt.type<"babybear"> + %71 = array.read %nondet_4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %72 = felt.add %70, %71 : !felt.type<"babybear">, !felt.type<"babybear"> + %73 = array.read %nondet_7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %74 = felt.add %72, %73 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = felt.add %67, %74 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %75 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a210] = %nondet_5 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a21] = %nondet_2 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a20] = %nondet_3 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a2] = %nondet : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a10] = %nondet_6 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet_1 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet_4 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_7 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_0 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, %arg1: !array.type<1,8 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a210] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a21] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a20] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a2] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@a10] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %6 = struct.readm %arg0[@a1] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %7 = struct.readm %arg0[@a0] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %8 = struct.readm %arg0[@a] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %9 = struct.readm %arg0[@s10] : <@MultiMux3_0::@MultiMux3_0<[]>>, !felt.type<"babybear"> + %10 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.mul %10, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %9, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %13 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%13) + } do { + %13 = array.read %arg1[%c0, %c7] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.sub %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg1[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.add %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %arg1[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.sub %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.sub %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.mul %27, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg1[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.sub %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.sub %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.mul %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %39, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = array.read %arg1[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = felt.mul %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %49, %48 : !felt.type<"babybear">, !felt.type<"babybear"> + %50 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %51 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %53, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = array.read %arg1[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %56 = felt.sub %54, %55 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = felt.sub %56, %57 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = felt.add %58, %59 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = felt.mul %60, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %62, %61 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %64 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.sub %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.mul %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %68, %67 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %71 = felt.sub %69, %70 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %73 = felt.mul %71, %72 : !felt.type<"babybear">, !felt.type<"babybear"> + %74 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %74, %73 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %76, %75 : !felt.type<"babybear">, !felt.type<"babybear"> + %77 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %78 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %79 = felt.add %77, %78 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %81 = felt.add %79, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %83 = felt.add %81, %82 : !felt.type<"babybear">, !felt.type<"babybear"> + %84 = array.read %arg2[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %85 = felt.mul %83, %84 : !felt.type<"babybear">, !felt.type<"babybear"> + %86 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %87 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %88 = felt.add %86, %87 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %90 = felt.add %88, %89 : !felt.type<"babybear">, !felt.type<"babybear"> + %91 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = felt.add %90, %91 : !felt.type<"babybear">, !felt.type<"babybear"> + %93 = felt.add %85, %92 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %94, %93 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux3_1 { + struct.def @Mux3_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %self = struct.new : <@Mux3_1::@Mux3_1<[]>> + %pod = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c8 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = function.call @MultiMux3_0::@MultiMux3_0::@compute(%12, %13) : (!array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + } + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = function.call @MultiMux3_0::@MultiMux3_0::@compute(%12, %13) : (!array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + %1 = struct.readm %0[@out] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux3_1::@Mux3_1<[]>>, !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + struct.writem %self[@mux] = %3 : <@Mux3_1::@Mux3_1<[]>>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + function.return %self : !struct.type<@Mux3_1::@Mux3_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux3_1::@Mux3_1<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux3_1::@Mux3_1<[]>>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux3_1::@Mux3_1<[]>>, !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @MultiMux3_0::@MultiMux3_0::@constrain(%1, %5, %6) : (!struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Constants_3 { + struct.def @Constants_3 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_191 = felt.const 191 : <"babybear"> {product_source = "compute"} + %felt_const_163 = felt.const 163 : <"babybear"> {product_source = "compute"} + %felt_const_107 = felt.const 107 : <"babybear"> {product_source = "compute"} + %felt_const_89 = felt.const 89 : <"babybear"> {product_source = "compute"} + %felt_const_71 = felt.const 71 : <"babybear"> {product_source = "compute"} + %felt_const_53 = felt.const 53 : <"babybear"> {product_source = "compute"} + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_37 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_47 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_53 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_71 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c4] = %felt_const_89 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %felt_const_107 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c6] = %felt_const_163 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c7] = %felt_const_191 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %0[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_89 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %felt_const_107 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%c6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %felt_const_163 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%c7] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_191 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @compute() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_191 = felt.const 191 : <"babybear"> {product_source = "compute"} + %felt_const_163 = felt.const 163 : <"babybear"> {product_source = "compute"} + %felt_const_107 = felt.const 107 : <"babybear"> {product_source = "compute"} + %felt_const_89 = felt.const 89 : <"babybear"> {product_source = "compute"} + %felt_const_71 = felt.const 71 : <"babybear"> {product_source = "compute"} + %felt_const_53 = felt.const 53 : <"babybear"> {product_source = "compute"} + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_37 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_47 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_53 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_71 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c4] = %felt_const_89 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %felt_const_107 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c6] = %felt_const_163 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c7] = %felt_const_191 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Constants_3::@Constants_3<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_191 = felt.const 191 : <"babybear"> {product_source = "constrain"} + %felt_const_163 = felt.const 163 : <"babybear"> {product_source = "constrain"} + %felt_const_107 = felt.const 107 : <"babybear"> {product_source = "constrain"} + %felt_const_89 = felt.const 89 : <"babybear"> {product_source = "constrain"} + %felt_const_71 = felt.const 71 : <"babybear"> {product_source = "constrain"} + %felt_const_53 = felt.const 53 : <"babybear"> {product_source = "constrain"} + %felt_const_47 = felt.const 47 : <"babybear"> {product_source = "constrain"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %0[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_71 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_89 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %felt_const_107 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%c6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %felt_const_163 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%c7] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_191 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Main_4 { + struct.def @Main_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @mux : !struct.type<@Mux3_1::@Mux3_1<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + struct.member @cst : !struct.type<@Constants_3::@Constants_3<[]>> + struct.member @cst$inputs : !pod.type<[]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c8 = arith.constant 8 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@product() : () -> !struct.type<@Constants_3::@Constants_3<[]>> + %1 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_4 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %22 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %24[%25] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %26 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@s] = %27 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Mux3_1::@Mux3_1::@compute(%32, %33) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %34 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %24[%25] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %26 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %27 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Mux3_1::@Mux3_1::@compute(%32, %33) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %34 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_2 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %7 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %8 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %9 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %9 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %10 = struct.readm %self[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = struct.readm %self[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %self[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %11[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %14[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %15[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %14[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %18 = struct.readm %13[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = pod.read %14[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux3_1::@Mux3_1::@constrain(%13, %19, %20) : (!struct.type<@Mux3_1::@Mux3_1<[]>>, !array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %21 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%11, %21) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%15) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c8 = arith.constant 8 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_4 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[]> {product_source = "compute"} + pod.write %pod_0[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@s] = %14 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @Mux3_1::@Mux3_1::@compute(%19, %20) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %21 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %14 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @Mux3_1::@Mux3_1::@compute(%19, %20) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %21 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_2 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %6 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %7 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %8 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %8 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Main_4::@Main_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %1[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %5[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %3[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %4[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux3_1::@Mux3_1::@constrain(%3, %9, %10) : (!struct.type<@Mux3_1::@Mux3_1<[]>>, !array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%1, %11) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%5) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mux4_1.llzk b/examples/circom-demo/mux4_1.llzk new file mode 100644 index 0000000..216bbc4 --- /dev/null +++ b/examples/circom-demo/mux4_1.llzk @@ -0,0 +1,1235 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Main_4::@Main_4<[]>>} { + poly.template @MultiMux4_0 { + struct.def @MultiMux4_0 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a3210 : !array.type<1 x !felt.type<"babybear">> + struct.member @a321 : !array.type<1 x !felt.type<"babybear">> + struct.member @a320 : !array.type<1 x !felt.type<"babybear">> + struct.member @a310 : !array.type<1 x !felt.type<"babybear">> + struct.member @a32 : !array.type<1 x !felt.type<"babybear">> + struct.member @a31 : !array.type<1 x !felt.type<"babybear">> + struct.member @a30 : !array.type<1 x !felt.type<"babybear">> + struct.member @a3 : !array.type<1 x !felt.type<"babybear">> + struct.member @a210 : !array.type<1 x !felt.type<"babybear">> + struct.member @a21 : !array.type<1 x !felt.type<"babybear">> + struct.member @a20 : !array.type<1 x !felt.type<"babybear">> + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a2 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + struct.member @s20 : !felt.type<"babybear"> + struct.member @s21 : !felt.type<"babybear"> + struct.member @s210 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,16 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c8 = arith.constant 8 : index + %c9 = arith.constant 9 : index + %c10 = arith.constant 10 : index + %c11 = arith.constant 11 : index + %c12 = arith.constant 12 : index + %c13 = arith.constant 13 : index + %c14 = arith.constant 14 : index + %c15 = arith.constant 15 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux4_0::@MultiMux4_0<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_4 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_6 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_7 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_8 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_9 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_10 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_11 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_12 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_13 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_14 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_15 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %3 = array.read %arg1[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s20] = %5 : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %6 = array.read %arg1[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %arg1[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s21] = %8 : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %9 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s210] = %10 : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %11 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%11) + } do { + %11 = array.read %arg0[%c0, %c15] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c14] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg0[%c0, %c13] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.sub %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.add %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg0[%c0, %c11] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.sub %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %arg0[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.add %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg0[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg0[%c0, %c7] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.sub %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = array.read %arg0[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.add %27, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg0[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = felt.add %29, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = felt.sub %31, %32 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = array.read %arg0[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = felt.add %33, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = felt.sub %35, %36 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = felt.sub %37, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = felt.add %39, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.mul %41, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %42 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %43 = array.read %arg0[%c0, %c14] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = array.read %arg0[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %45 = felt.sub %43, %44 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = array.read %arg0[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %47 = felt.sub %45, %46 : !felt.type<"babybear">, !felt.type<"babybear"> + %48 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = felt.add %47, %48 : !felt.type<"babybear">, !felt.type<"babybear"> + %50 = array.read %arg0[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %51 = felt.sub %49, %50 : !felt.type<"babybear">, !felt.type<"babybear"> + %52 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %53 = felt.add %51, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = felt.add %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = felt.sub %55, %56 : !felt.type<"babybear">, !felt.type<"babybear"> + %58 = felt.mul %57, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %58 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %59 = array.read %arg0[%c0, %c13] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = array.read %arg0[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %61 = felt.sub %59, %60 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %arg0[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %63 = felt.sub %61, %62 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.add %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg0[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.sub %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %69 = felt.add %67, %68 : !felt.type<"babybear">, !felt.type<"babybear"> + %70 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %71 = felt.add %69, %70 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %73 = felt.sub %71, %72 : !felt.type<"babybear">, !felt.type<"babybear"> + %74 = felt.mul %73, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %74 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %75 = array.read %arg0[%c0, %c11] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = array.read %arg0[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = felt.sub %75, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + %78 = array.read %arg0[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %79 = felt.sub %77, %78 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %81 = felt.add %79, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = array.read %arg0[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %83 = felt.sub %81, %82 : !felt.type<"babybear">, !felt.type<"babybear"> + %84 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %85 = felt.add %83, %84 : !felt.type<"babybear">, !felt.type<"babybear"> + %86 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %87 = felt.add %85, %86 : !felt.type<"babybear">, !felt.type<"babybear"> + %88 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %89 = felt.sub %87, %88 : !felt.type<"babybear">, !felt.type<"babybear"> + %90 = felt.mul %89, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_7[%c0] = %90 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %91 = array.read %arg0[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %93 = felt.sub %91, %92 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %95 = felt.sub %93, %94 : !felt.type<"babybear">, !felt.type<"babybear"> + %96 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %97 = felt.add %95, %96 : !felt.type<"babybear">, !felt.type<"babybear"> + %98 = array.read %arg1[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %99 = felt.mul %97, %98 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_15[%c0] = %99 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %100 = array.read %arg0[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %101 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %102 = felt.sub %100, %101 : !felt.type<"babybear">, !felt.type<"babybear"> + %103 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %104 = felt.sub %102, %103 : !felt.type<"babybear">, !felt.type<"babybear"> + %105 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %106 = felt.add %104, %105 : !felt.type<"babybear">, !felt.type<"babybear"> + %107 = array.read %arg1[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %108 = felt.mul %106, %107 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %108 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %109 = array.read %arg0[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %110 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %111 = felt.sub %109, %110 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %113 = felt.sub %111, %112 : !felt.type<"babybear">, !felt.type<"babybear"> + %114 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %115 = felt.add %113, %114 : !felt.type<"babybear">, !felt.type<"babybear"> + %116 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %117 = felt.mul %115, %116 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_13[%c0] = %117 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %118 = array.read %arg0[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %119 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %120 = felt.sub %118, %119 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_9[%c0] = %120 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %121 = array.read %arg0[%c0, %c7] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %122 = array.read %arg0[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %123 = felt.sub %121, %122 : !felt.type<"babybear">, !felt.type<"babybear"> + %124 = array.read %arg0[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %125 = felt.sub %123, %124 : !felt.type<"babybear">, !felt.type<"babybear"> + %126 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %127 = felt.add %125, %126 : !felt.type<"babybear">, !felt.type<"babybear"> + %128 = array.read %arg0[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %129 = felt.sub %127, %128 : !felt.type<"babybear">, !felt.type<"babybear"> + %130 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %131 = felt.add %129, %130 : !felt.type<"babybear">, !felt.type<"babybear"> + %132 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %133 = felt.add %131, %132 : !felt.type<"babybear">, !felt.type<"babybear"> + %134 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %135 = felt.sub %133, %134 : !felt.type<"babybear">, !felt.type<"babybear"> + %136 = felt.mul %135, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_8[%c0] = %136 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %137 = array.read %arg0[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %138 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %139 = felt.sub %137, %138 : !felt.type<"babybear">, !felt.type<"babybear"> + %140 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %141 = felt.sub %139, %140 : !felt.type<"babybear">, !felt.type<"babybear"> + %142 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %143 = felt.add %141, %142 : !felt.type<"babybear">, !felt.type<"babybear"> + %144 = felt.mul %143, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_11[%c0] = %144 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %145 = array.read %arg0[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %146 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %147 = felt.sub %145, %146 : !felt.type<"babybear">, !felt.type<"babybear"> + %148 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %149 = felt.sub %147, %148 : !felt.type<"babybear">, !felt.type<"babybear"> + %150 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %151 = felt.add %149, %150 : !felt.type<"babybear">, !felt.type<"babybear"> + %152 = felt.mul %151, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_10[%c0] = %152 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %153 = array.read %arg0[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %154 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %155 = felt.sub %153, %154 : !felt.type<"babybear">, !felt.type<"babybear"> + %156 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %157 = felt.sub %155, %156 : !felt.type<"babybear">, !felt.type<"babybear"> + %158 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %159 = felt.add %157, %158 : !felt.type<"babybear">, !felt.type<"babybear"> + %160 = felt.mul %159, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_6[%c0] = %160 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %161 = array.read %arg0[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %162 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %163 = felt.sub %161, %162 : !felt.type<"babybear">, !felt.type<"babybear"> + %164 = array.read %arg1[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %165 = felt.mul %163, %164 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %165 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %166 = array.read %arg0[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %167 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %168 = felt.sub %166, %167 : !felt.type<"babybear">, !felt.type<"babybear"> + %169 = array.read %arg1[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %170 = felt.mul %168, %169 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_12[%c0] = %170 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %171 = array.read %arg0[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %172 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %173 = felt.sub %171, %172 : !felt.type<"babybear">, !felt.type<"babybear"> + %174 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %175 = felt.mul %173, %174 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_14[%c0] = %175 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %176 = array.read %arg0[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c0] = %176 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %177 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %178 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %179 = felt.add %177, %178 : !felt.type<"babybear">, !felt.type<"babybear"> + %180 = array.read %nondet_3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %181 = felt.add %179, %180 : !felt.type<"babybear">, !felt.type<"babybear"> + %182 = array.read %nondet_7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %183 = felt.add %181, %182 : !felt.type<"babybear">, !felt.type<"babybear"> + %184 = array.read %nondet_15[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %185 = felt.add %183, %184 : !felt.type<"babybear">, !felt.type<"babybear"> + %186 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %187 = felt.add %185, %186 : !felt.type<"babybear">, !felt.type<"babybear"> + %188 = array.read %nondet_13[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %189 = felt.add %187, %188 : !felt.type<"babybear">, !felt.type<"babybear"> + %190 = array.read %nondet_9[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %191 = felt.add %189, %190 : !felt.type<"babybear">, !felt.type<"babybear"> + %192 = array.read %arg1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %193 = felt.mul %191, %192 : !felt.type<"babybear">, !felt.type<"babybear"> + %194 = array.read %nondet_8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %195 = array.read %nondet_11[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %196 = felt.add %194, %195 : !felt.type<"babybear">, !felt.type<"babybear"> + %197 = array.read %nondet_10[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %198 = felt.add %196, %197 : !felt.type<"babybear">, !felt.type<"babybear"> + %199 = array.read %nondet_6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %200 = felt.add %198, %199 : !felt.type<"babybear">, !felt.type<"babybear"> + %201 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %202 = felt.add %200, %201 : !felt.type<"babybear">, !felt.type<"babybear"> + %203 = array.read %nondet_12[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %204 = felt.add %202, %203 : !felt.type<"babybear">, !felt.type<"babybear"> + %205 = array.read %nondet_14[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %206 = felt.add %204, %205 : !felt.type<"babybear">, !felt.type<"babybear"> + %207 = array.read %nondet_5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %208 = felt.add %206, %207 : !felt.type<"babybear">, !felt.type<"babybear"> + %209 = felt.add %193, %208 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %209 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a3210] = %nondet : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a321] = %nondet_0 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a320] = %nondet_3 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a310] = %nondet_7 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a32] = %nondet_15 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a31] = %nondet_1 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a30] = %nondet_13 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a3] = %nondet_9 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a210] = %nondet_8 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a21] = %nondet_11 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a20] = %nondet_10 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a10] = %nondet_6 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a2] = %nondet_2 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet_12 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet_14 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_5 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_4 : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, %arg1: !array.type<1,16 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c8 = arith.constant 8 : index + %c9 = arith.constant 9 : index + %c10 = arith.constant 10 : index + %c11 = arith.constant 11 : index + %c12 = arith.constant 12 : index + %c13 = arith.constant 13 : index + %c14 = arith.constant 14 : index + %c15 = arith.constant 15 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a3210] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a321] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a320] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a310] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@a32] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %6 = struct.readm %arg0[@a31] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %7 = struct.readm %arg0[@a30] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %8 = struct.readm %arg0[@a3] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %9 = struct.readm %arg0[@a210] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %10 = struct.readm %arg0[@a21] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %11 = struct.readm %arg0[@a20] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %12 = struct.readm %arg0[@a10] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %13 = struct.readm %arg0[@a2] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %14 = struct.readm %arg0[@a1] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %15 = struct.readm %arg0[@a0] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %16 = struct.readm %arg0[@a] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %17 = struct.readm %arg0[@s10] : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %18 = struct.readm %arg0[@s20] : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %19 = struct.readm %arg0[@s21] : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %20 = struct.readm %arg0[@s210] : <@MultiMux4_0::@MultiMux4_0<[]>>, !felt.type<"babybear"> + %21 = array.read %arg2[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %arg2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.mul %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %17, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg2[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %arg2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.mul %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %18, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %arg2[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = array.read %arg2[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.mul %27, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %19, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = felt.mul %19, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %20, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %32 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%32) + } do { + %32 = array.read %arg1[%c0, %c15] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = array.read %arg1[%c0, %c14] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.sub %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0, %c13] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.sub %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %arg1[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %arg1[%c0, %c11] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = array.read %arg1[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg1[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.add %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.sub %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = array.read %arg1[%c0, %c7] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = array.read %arg1[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = array.read %arg1[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.add %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = felt.sub %52, %53 : !felt.type<"babybear">, !felt.type<"babybear"> + %55 = array.read %arg1[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %56 = felt.add %54, %55 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = felt.sub %56, %57 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = felt.sub %58, %59 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %62 = felt.add %60, %61 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = felt.mul %62, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %64, %63 : !felt.type<"babybear">, !felt.type<"babybear"> + %65 = array.read %arg1[%c0, %c14] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %66 = array.read %arg1[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.sub %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %arg1[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %69 = felt.sub %67, %68 : !felt.type<"babybear">, !felt.type<"babybear"> + %70 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %71 = felt.add %69, %70 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = array.read %arg1[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %73 = felt.sub %71, %72 : !felt.type<"babybear">, !felt.type<"babybear"> + %74 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %75 = felt.add %73, %74 : !felt.type<"babybear">, !felt.type<"babybear"> + %76 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %77 = felt.add %75, %76 : !felt.type<"babybear">, !felt.type<"babybear"> + %78 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %79 = felt.sub %77, %78 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = felt.mul %79, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %81 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %81, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = array.read %arg1[%c0, %c13] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %83 = array.read %arg1[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %84 = felt.sub %82, %83 : !felt.type<"babybear">, !felt.type<"babybear"> + %85 = array.read %arg1[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %86 = felt.sub %84, %85 : !felt.type<"babybear">, !felt.type<"babybear"> + %87 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %88 = felt.add %86, %87 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = array.read %arg1[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %90 = felt.sub %88, %89 : !felt.type<"babybear">, !felt.type<"babybear"> + %91 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = felt.add %90, %91 : !felt.type<"babybear">, !felt.type<"babybear"> + %93 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %94 = felt.add %92, %93 : !felt.type<"babybear">, !felt.type<"babybear"> + %95 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %96 = felt.sub %94, %95 : !felt.type<"babybear">, !felt.type<"babybear"> + %97 = felt.mul %96, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %98 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %98, %97 : !felt.type<"babybear">, !felt.type<"babybear"> + %99 = array.read %arg1[%c0, %c11] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %100 = array.read %arg1[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %101 = felt.sub %99, %100 : !felt.type<"babybear">, !felt.type<"babybear"> + %102 = array.read %arg1[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %103 = felt.sub %101, %102 : !felt.type<"babybear">, !felt.type<"babybear"> + %104 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %105 = felt.add %103, %104 : !felt.type<"babybear">, !felt.type<"babybear"> + %106 = array.read %arg1[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %107 = felt.sub %105, %106 : !felt.type<"babybear">, !felt.type<"babybear"> + %108 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %109 = felt.add %107, %108 : !felt.type<"babybear">, !felt.type<"babybear"> + %110 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %111 = felt.add %109, %110 : !felt.type<"babybear">, !felt.type<"babybear"> + %112 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %113 = felt.sub %111, %112 : !felt.type<"babybear">, !felt.type<"babybear"> + %114 = felt.mul %113, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %115 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %115, %114 : !felt.type<"babybear">, !felt.type<"babybear"> + %116 = array.read %arg1[%c0, %c12] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %117 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %118 = felt.sub %116, %117 : !felt.type<"babybear">, !felt.type<"babybear"> + %119 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %120 = felt.sub %118, %119 : !felt.type<"babybear">, !felt.type<"babybear"> + %121 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %122 = felt.add %120, %121 : !felt.type<"babybear">, !felt.type<"babybear"> + %123 = array.read %arg2[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %124 = felt.mul %122, %123 : !felt.type<"babybear">, !felt.type<"babybear"> + %125 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %125, %124 : !felt.type<"babybear">, !felt.type<"babybear"> + %126 = array.read %arg1[%c0, %c10] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %127 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %128 = felt.sub %126, %127 : !felt.type<"babybear">, !felt.type<"babybear"> + %129 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %130 = felt.sub %128, %129 : !felt.type<"babybear">, !felt.type<"babybear"> + %131 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %132 = felt.add %130, %131 : !felt.type<"babybear">, !felt.type<"babybear"> + %133 = array.read %arg2[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %134 = felt.mul %132, %133 : !felt.type<"babybear">, !felt.type<"babybear"> + %135 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %135, %134 : !felt.type<"babybear">, !felt.type<"babybear"> + %136 = array.read %arg1[%c0, %c9] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %137 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %138 = felt.sub %136, %137 : !felt.type<"babybear">, !felt.type<"babybear"> + %139 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %140 = felt.sub %138, %139 : !felt.type<"babybear">, !felt.type<"babybear"> + %141 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %142 = felt.add %140, %141 : !felt.type<"babybear">, !felt.type<"babybear"> + %143 = array.read %arg2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %144 = felt.mul %142, %143 : !felt.type<"babybear">, !felt.type<"babybear"> + %145 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %145, %144 : !felt.type<"babybear">, !felt.type<"babybear"> + %146 = array.read %arg1[%c0, %c8] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %147 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %148 = felt.sub %146, %147 : !felt.type<"babybear">, !felt.type<"babybear"> + %149 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %149, %148 : !felt.type<"babybear">, !felt.type<"babybear"> + %150 = array.read %arg1[%c0, %c7] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %151 = array.read %arg1[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %152 = felt.sub %150, %151 : !felt.type<"babybear">, !felt.type<"babybear"> + %153 = array.read %arg1[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %154 = felt.sub %152, %153 : !felt.type<"babybear">, !felt.type<"babybear"> + %155 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %156 = felt.add %154, %155 : !felt.type<"babybear">, !felt.type<"babybear"> + %157 = array.read %arg1[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %158 = felt.sub %156, %157 : !felt.type<"babybear">, !felt.type<"babybear"> + %159 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %160 = felt.add %158, %159 : !felt.type<"babybear">, !felt.type<"babybear"> + %161 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %162 = felt.add %160, %161 : !felt.type<"babybear">, !felt.type<"babybear"> + %163 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %164 = felt.sub %162, %163 : !felt.type<"babybear">, !felt.type<"babybear"> + %165 = felt.mul %164, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %166 = array.read %9[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %166, %165 : !felt.type<"babybear">, !felt.type<"babybear"> + %167 = array.read %arg1[%c0, %c6] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %168 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %169 = felt.sub %167, %168 : !felt.type<"babybear">, !felt.type<"babybear"> + %170 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %171 = felt.sub %169, %170 : !felt.type<"babybear">, !felt.type<"babybear"> + %172 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %173 = felt.add %171, %172 : !felt.type<"babybear">, !felt.type<"babybear"> + %174 = felt.mul %173, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %175 = array.read %10[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %175, %174 : !felt.type<"babybear">, !felt.type<"babybear"> + %176 = array.read %arg1[%c0, %c5] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %177 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %178 = felt.sub %176, %177 : !felt.type<"babybear">, !felt.type<"babybear"> + %179 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %180 = felt.sub %178, %179 : !felt.type<"babybear">, !felt.type<"babybear"> + %181 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %182 = felt.add %180, %181 : !felt.type<"babybear">, !felt.type<"babybear"> + %183 = felt.mul %182, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %184 = array.read %11[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %184, %183 : !felt.type<"babybear">, !felt.type<"babybear"> + %185 = array.read %arg1[%c0, %c3] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %186 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %187 = felt.sub %185, %186 : !felt.type<"babybear">, !felt.type<"babybear"> + %188 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %189 = felt.sub %187, %188 : !felt.type<"babybear">, !felt.type<"babybear"> + %190 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %191 = felt.add %189, %190 : !felt.type<"babybear">, !felt.type<"babybear"> + %192 = felt.mul %191, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %193 = array.read %12[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %193, %192 : !felt.type<"babybear">, !felt.type<"babybear"> + %194 = array.read %arg1[%c0, %c4] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %195 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %196 = felt.sub %194, %195 : !felt.type<"babybear">, !felt.type<"babybear"> + %197 = array.read %arg2[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %198 = felt.mul %196, %197 : !felt.type<"babybear">, !felt.type<"babybear"> + %199 = array.read %13[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %199, %198 : !felt.type<"babybear">, !felt.type<"babybear"> + %200 = array.read %arg1[%c0, %c2] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %201 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %202 = felt.sub %200, %201 : !felt.type<"babybear">, !felt.type<"babybear"> + %203 = array.read %arg2[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %204 = felt.mul %202, %203 : !felt.type<"babybear">, !felt.type<"babybear"> + %205 = array.read %14[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %205, %204 : !felt.type<"babybear">, !felt.type<"babybear"> + %206 = array.read %arg1[%c0, %c1] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %207 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %208 = felt.sub %206, %207 : !felt.type<"babybear">, !felt.type<"babybear"> + %209 = array.read %arg2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %210 = felt.mul %208, %209 : !felt.type<"babybear">, !felt.type<"babybear"> + %211 = array.read %15[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %211, %210 : !felt.type<"babybear">, !felt.type<"babybear"> + %212 = array.read %arg1[%c0, %c0] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %213 = array.read %16[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %213, %212 : !felt.type<"babybear">, !felt.type<"babybear"> + %214 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %215 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %216 = felt.add %214, %215 : !felt.type<"babybear">, !felt.type<"babybear"> + %217 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %218 = felt.add %216, %217 : !felt.type<"babybear">, !felt.type<"babybear"> + %219 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %220 = felt.add %218, %219 : !felt.type<"babybear">, !felt.type<"babybear"> + %221 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %222 = felt.add %220, %221 : !felt.type<"babybear">, !felt.type<"babybear"> + %223 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %224 = felt.add %222, %223 : !felt.type<"babybear">, !felt.type<"babybear"> + %225 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %226 = felt.add %224, %225 : !felt.type<"babybear">, !felt.type<"babybear"> + %227 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %228 = felt.add %226, %227 : !felt.type<"babybear">, !felt.type<"babybear"> + %229 = array.read %arg2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %230 = felt.mul %228, %229 : !felt.type<"babybear">, !felt.type<"babybear"> + %231 = array.read %9[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %232 = array.read %10[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %233 = felt.add %231, %232 : !felt.type<"babybear">, !felt.type<"babybear"> + %234 = array.read %11[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %235 = felt.add %233, %234 : !felt.type<"babybear">, !felt.type<"babybear"> + %236 = array.read %12[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %237 = felt.add %235, %236 : !felt.type<"babybear">, !felt.type<"babybear"> + %238 = array.read %13[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %239 = felt.add %237, %238 : !felt.type<"babybear">, !felt.type<"babybear"> + %240 = array.read %14[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %241 = felt.add %239, %240 : !felt.type<"babybear">, !felt.type<"babybear"> + %242 = array.read %15[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %243 = felt.add %241, %242 : !felt.type<"babybear">, !felt.type<"babybear"> + %244 = array.read %16[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %245 = felt.add %243, %244 : !felt.type<"babybear">, !felt.type<"babybear"> + %246 = felt.add %230, %245 : !felt.type<"babybear">, !felt.type<"babybear"> + %247 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %247, %246 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux4_1 { + struct.def @Mux4_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Mux4_1::@Mux4_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c20 = arith.constant 20 : index + %self = struct.new : <@Mux4_1::@Mux4_1<[]>> + %pod = pod.new { @count = %c20 } : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c16 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<1,16 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<1,16 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<1,16 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %14 = function.call @MultiMux4_0::@MultiMux4_0::@compute(%12, %13) : (!array.type<1,16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + } + } + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<1,16 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %14 = function.call @MultiMux4_0::@MultiMux4_0::@compute(%12, %13) : (!array.type<1,16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + %1 = struct.readm %0[@out] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux4_1::@Mux4_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux4_1::@Mux4_1<[]>>, !pod.type<[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + struct.writem %self[@mux] = %3 : <@Mux4_1::@Mux4_1<[]>>, !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + function.return %self : !struct.type<@Mux4_1::@Mux4_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux4_1::@Mux4_1<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux4_1::@Mux4_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux4_1::@Mux4_1<[]>>, !struct.type<@MultiMux4_0::@MultiMux4_0<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux4_1::@Mux4_1<[]>>, !pod.type<[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c16 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<1,16 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,16 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<1,16 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + function.call @MultiMux4_0::@MultiMux4_0::@constrain(%1, %5, %6) : (!struct.type<@MultiMux4_0::@MultiMux4_0<[]>>, !array.type<1,16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Constants_3 { + struct.def @Constants_3 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + function.def @product() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_4456 = felt.const 4456 : <"babybear"> {product_source = "compute"} + %felt_const_4256 = felt.const 4256 : <"babybear"> {product_source = "compute"} + %felt_const_1223 = felt.const 1223 : <"babybear"> {product_source = "compute"} + %felt_const_4566 = felt.const 4566 : <"babybear"> {product_source = "compute"} + %felt_const_15623 = felt.const 15623 : <"babybear"> {product_source = "compute"} + %felt_const_44356 = felt.const 44356 : <"babybear"> {product_source = "compute"} + %felt_const_134523 = felt.const 134523 : <"babybear"> {product_source = "compute"} + %felt_const_4546 = felt.const 4546 : <"babybear"> {product_source = "compute"} + %felt_const_333 = felt.const 333 : <"babybear"> {product_source = "compute"} + %felt_const_222 = felt.const 222 : <"babybear"> {product_source = "compute"} + %felt_const_111 = felt.const 111 : <"babybear"> {product_source = "compute"} + %felt_const_12 = felt.const 12 : <"babybear"> {product_source = "compute"} + %felt_const_789 = felt.const 789 : <"babybear"> {product_source = "compute"} + %felt_const_456 = felt.const 456 : <"babybear"> {product_source = "compute"} + %felt_const_123 = felt.const 123 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_123 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_456 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_789 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c4] = %felt_const_111 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %felt_const_222 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c6] = %felt_const_333 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c7] = %felt_const_4546 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c8] = %felt_const_134523 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c9] = %felt_const_44356 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c10] = %felt_const_15623 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c11] = %felt_const_4566 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c12] = %felt_const_1223 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c13] = %felt_const_4546 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c14] = %felt_const_4256 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c15] = %felt_const_4456 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_123 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_456 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %0[%c2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_789 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_111 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%c5] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %felt_const_222 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%c6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %felt_const_333 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%c7] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_4546 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%c8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_134523 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%c9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_44356 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%c10] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_15623 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%c11] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %felt_const_4566 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%c12] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_1223 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%c13] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %felt_const_4546 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c14] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %felt_const_4256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%c15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %felt_const_4456 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @compute() -> !struct.type<@Constants_3::@Constants_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_4456 = felt.const 4456 : <"babybear"> {product_source = "compute"} + %felt_const_4256 = felt.const 4256 : <"babybear"> {product_source = "compute"} + %felt_const_1223 = felt.const 1223 : <"babybear"> {product_source = "compute"} + %felt_const_4566 = felt.const 4566 : <"babybear"> {product_source = "compute"} + %felt_const_15623 = felt.const 15623 : <"babybear"> {product_source = "compute"} + %felt_const_44356 = felt.const 44356 : <"babybear"> {product_source = "compute"} + %felt_const_134523 = felt.const 134523 : <"babybear"> {product_source = "compute"} + %felt_const_4546 = felt.const 4546 : <"babybear"> {product_source = "compute"} + %felt_const_333 = felt.const 333 : <"babybear"> {product_source = "compute"} + %felt_const_222 = felt.const 222 : <"babybear"> {product_source = "compute"} + %felt_const_111 = felt.const 111 : <"babybear"> {product_source = "compute"} + %felt_const_12 = felt.const 12 : <"babybear"> {product_source = "compute"} + %felt_const_789 = felt.const 789 : <"babybear"> {product_source = "compute"} + %felt_const_456 = felt.const 456 : <"babybear"> {product_source = "compute"} + %felt_const_123 = felt.const 123 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_123 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_456 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_789 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_12 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c4] = %felt_const_111 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %felt_const_222 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c6] = %felt_const_333 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c7] = %felt_const_4546 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c8] = %felt_const_134523 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c9] = %felt_const_44356 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c10] = %felt_const_15623 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c11] = %felt_const_4566 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c12] = %felt_const_1223 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c13] = %felt_const_4546 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c14] = %felt_const_4256 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c15] = %felt_const_4456 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Constants_3::@Constants_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Constants_3::@Constants_3<[]>>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_4456 = felt.const 4456 : <"babybear"> {product_source = "constrain"} + %felt_const_4256 = felt.const 4256 : <"babybear"> {product_source = "constrain"} + %felt_const_1223 = felt.const 1223 : <"babybear"> {product_source = "constrain"} + %felt_const_4566 = felt.const 4566 : <"babybear"> {product_source = "constrain"} + %felt_const_15623 = felt.const 15623 : <"babybear"> {product_source = "constrain"} + %felt_const_44356 = felt.const 44356 : <"babybear"> {product_source = "constrain"} + %felt_const_134523 = felt.const 134523 : <"babybear"> {product_source = "constrain"} + %felt_const_4546 = felt.const 4546 : <"babybear"> {product_source = "constrain"} + %felt_const_333 = felt.const 333 : <"babybear"> {product_source = "constrain"} + %felt_const_222 = felt.const 222 : <"babybear"> {product_source = "constrain"} + %felt_const_111 = felt.const 111 : <"babybear"> {product_source = "constrain"} + %felt_const_12 = felt.const 12 : <"babybear"> {product_source = "constrain"} + %felt_const_789 = felt.const 789 : <"babybear"> {product_source = "constrain"} + %felt_const_456 = felt.const 456 : <"babybear"> {product_source = "constrain"} + %felt_const_123 = felt.const 123 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %0[%c0] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %felt_const_123 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %0[%c1] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %2, %felt_const_456 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %0[%c2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %felt_const_789 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_111 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%c5] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %felt_const_222 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%c6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %felt_const_333 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%c7] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_4546 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%c8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_134523 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%c9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_44356 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%c10] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_15623 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%c11] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %felt_const_4566 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%c12] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_1223 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%c13] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %felt_const_4546 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c14] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %felt_const_4256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%c15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %felt_const_4456 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Main_4 { + struct.def @Main_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@Mux4_1::@Mux4_1<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> + struct.member @cst : !struct.type<@Constants_3::@Constants_3<[]>> + struct.member @cst$inputs : !pod.type<[]> + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c16 = arith.constant 16 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c20 = arith.constant {product_source = "compute"} 20 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c20 } : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@product() : () -> !struct.type<@Constants_3::@Constants_3<[]>> + %1 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %pod_4 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_5[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %22 = pod.read %pod_5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %24[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_0[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %26 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %27 : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_0[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_0[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Mux4_1::@Mux4_1::@compute(%32, %33) : (!array.type<16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c16 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %24[%25] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_0[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %27[%28] = %26 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %27 : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %pod_0[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_0[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @Mux4_1::@Mux4_1::@compute(%32, %33) : (!array.type<16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Mux4_1::@Mux4_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %7 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %8 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_3 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %9 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %9 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %10 = struct.readm %self[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %self[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %15 = struct.readm %self[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %15[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %12[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c16 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %13[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %12[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %18 = struct.readm %11[@out] : <@Mux4_1::@Mux4_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %16[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%15, %19) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %20 = pod.read %12[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = pod.read %12[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux4_1::@Mux4_1::@constrain(%11, %20, %21) : (!struct.type<@Mux4_1::@Mux4_1<[]>>, !array.type<16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%13) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Main_4::@Main_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c16 = arith.constant 16 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c20 = arith.constant {product_source = "compute"} 20 : index + %self = struct.new : <@Main_4::@Main_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c20 } : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new : <[]> {product_source = "compute"} + %0 = function.call @Constants_3::@Constants_3::@compute() : () -> !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %pod_2 = pod.new { @comp = %0 } : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[]> {product_source = "compute"} + %pod_4 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_5[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %9 = pod.read %pod_5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %10 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %14 : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_0[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @Mux4_1::@Mux4_1::@compute(%19, %20) : (!array.type<16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %21 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c16 step %c1 { + %9 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %11[%12] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %14 : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_0[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @Mux4_1::@Mux4_1::@compute(%19, %20) : (!array.type<16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %21 : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Mux4_1::@Mux4_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %5 : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_5 : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %6 : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux4_1::@Mux4_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %7 : <@Main_4::@Main_4<[]>>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "compute"} + struct.writem %self[@cst$inputs] = %pod_3 : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "compute"} + %8 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@Constants_3::@Constants_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + struct.writem %self[@cst] = %8 : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Main_4::@Main_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Main_4::@Main_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c16 = arith.constant 16 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Main_4::@Main_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@mux] : <@Main_4::@Main_4<[]>>, !struct.type<@Mux4_1::@Mux4_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mux$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@cst] : <@Main_4::@Main_4<[]>>, !struct.type<@Constants_3::@Constants_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@cst$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[]> {product_source = "constrain"} + %5 = struct.readm %arg0[@n2b] : <@Main_4::@Main_4<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@n2b$inputs] : <@Main_4::@Main_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %7 = pod.read %6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %5[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c16 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %3[@out] : <@Constants_3::@Constants_3<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Mux4_1::@Mux4_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%5, %9) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %10 = pod.read %2[@c] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %2[@s] : <[@c: !array.type<16 x !felt.type<"babybear">>, @s: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux4_1::@Mux4_1::@constrain(%1, %10, %11) : (!struct.type<@Mux4_1::@Mux4_1<[]>>, !array.type<16 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.call @Constants_3::@Constants_3::@constrain(%3) : (!struct.type<@Constants_3::@Constants_3<[]>>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mux_decode.llzk b/examples/circom-demo/mux_decode.llzk new file mode 100644 index 0000000..5765648 --- /dev/null +++ b/examples/circom-demo/mux_decode.llzk @@ -0,0 +1,104 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Decoder_0::@Decoder_0<[]>>} { + poly.template @Decoder_0 { + struct.def @Decoder_0 { + struct.member @out : !array.type<16 x !felt.type<"babybear">> {llzk.pub} + struct.member @success : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Decoder_0::@Decoder_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Decoder_0::@Decoder_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Decoder_0::@Decoder_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@success] : <@Decoder_0::@Decoder_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2:2 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp eq(%arg0, %5) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%18] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%18] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet[%7] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%11] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %arg0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %arg3, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@success] = %2#0 : <@Decoder_0::@Decoder_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Decoder_0::@Decoder_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1, %2#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Decoder_0::@Decoder_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Decoder_0::@Decoder_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Decoder_0::@Decoder_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c16 step %c1 iter_args(%arg2 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp eq(%arg0, %1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %felt_const_1 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %felt_const_0 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@success] = %0 : <@Decoder_0::@Decoder_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Decoder_0::@Decoder_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Decoder_0::@Decoder_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Decoder_0::@Decoder_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Decoder_0::@Decoder_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@success] : <@Decoder_0::@Decoder_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.sub %arg1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12 : !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.mul %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/mux_ep.llzk b/examples/circom-demo/mux_ep.llzk new file mode 100644 index 0000000..ba5f2f1 --- /dev/null +++ b/examples/circom-demo/mux_ep.llzk @@ -0,0 +1,99 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@EscalarProduct_0::@EscalarProduct_0<[]>>} { + poly.template @EscalarProduct_0 { + struct.def @EscalarProduct_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub, signal} + struct.member @aux : !array.type<16 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<16 x !felt.type<"babybear">>, %arg1: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EscalarProduct_0::@EscalarProduct_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@EscalarProduct_0::@EscalarProduct_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@aux] : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %2:2 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg1[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %nondet[%10] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%14] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %1[%19] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %1[%21] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %12, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %2#0 : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@aux] = %nondet : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %0, %2#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@EscalarProduct_0::@EscalarProduct_0<[]>> + } + function.def @compute(%arg0: !array.type<16 x !felt.type<"babybear">>, %arg1: !array.type<16 x !felt.type<"babybear">>) -> !struct.type<@EscalarProduct_0::@EscalarProduct_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@EscalarProduct_0::@EscalarProduct_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + %0 = scf.for %arg2 = %c0 to %c16 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg1[%4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet[%8] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %10 : !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0 : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@aux] = %nondet : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@EscalarProduct_0::@EscalarProduct_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@EscalarProduct_0::@EscalarProduct_0<[]>>, %arg1: !array.type<16 x !felt.type<"babybear">>, %arg2: !array.type<16 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c16 = arith.constant 16 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux] : <@EscalarProduct_0::@EscalarProduct_0<[]>>, !array.type<16 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = scf.for %arg3 = %c0 to %c16 step %c1 iter_args(%arg4 = %felt_const_0) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%4] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg2[%6] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %1[%9] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %1[%11] : <16 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13 : !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/outer_test.llzk b/examples/circom-demo/outer_test.llzk new file mode 100644 index 0000000..4d21919 --- /dev/null +++ b/examples/circom-demo/outer_test.llzk @@ -0,0 +1,91 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@outer_0::@outer_0<[]>>} { + poly.template @outer_0 { + struct.def @outer_0 { + struct.member @out : !array.type<2,3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@outer_0::@outer_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@outer_0::@outer_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@outer_0::@outer_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9, %10] = %8 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%17, %18] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@outer_0::@outer_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@outer_0::@outer_0<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@outer_0::@outer_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@outer_0::@outer_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg1[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7, %8] = %6 : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@outer_0::@outer_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@outer_0::@outer_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@outer_0::@outer_0<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@outer_0::@outer_0<[]>>, !array.type<2,3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg2[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%8, %9] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/pad_test.llzk b/examples/circom-demo/pad_test.llzk new file mode 100644 index 0000000..180871c --- /dev/null +++ b/examples/circom-demo/pad_test.llzk @@ -0,0 +1,305 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Pad_0::@Pad_0<[]>>} { + poly.template @Pad_0 { + struct.def @Pad_0 { + struct.member @out : !array.type<1088 x !felt.type<"babybear">> {llzk.pub} + struct.member @out2 : !array.type<1088 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Pad_0::@Pad_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1080 = arith.constant 1080 : index + %c1088 = arith.constant 1088 : index + %c264 = arith.constant 264 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1080 = felt.const 1080 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Pad_0::@Pad_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%5] = %4 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%6] = %4 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c264 to %c1088 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%3] = %felt_const_0 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet_0[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %4 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c264 to %c1080 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %felt_const_128, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %2, %felt_const_1080 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %4 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out2] = %nondet_0 : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@out2] : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg0[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %1[%5] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.shr %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%6] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c264 to %c1088 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %1[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %1[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.shr %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c264 to %c1080 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.shr %felt_const_128, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %2, %felt_const_1080 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Pad_0::@Pad_0<[]>> + } + function.def @compute(%arg0: !array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Pad_0::@Pad_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1080 = arith.constant 1080 : index + %c1088 = arith.constant 1088 : index + %c264 = arith.constant 264 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1080 = felt.const 1080 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Pad_0::@Pad_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%1] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%3] = %2 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %0, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%4] = %2 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c264 to %c1088 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%1] = %felt_const_0 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_0[%1] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %2 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %0, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %2 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c264 to %c1080 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%1] = %felt_const_0 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.shr %felt_const_128, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.bit_and %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %0, %felt_const_1080 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %2 : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out2] = %nondet_0 : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Pad_0::@Pad_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Pad_0::@Pad_0<[]>>, %arg1: !array.type<256 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1080 = arith.constant 1080 : index + %c1088 = arith.constant 1088 : index + %c264 = arith.constant 264 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1080 = felt.const 1080 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@out2] : <@Pad_0::@Pad_0<[]>>, !array.type<1088 x !felt.type<"babybear">> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg2 = %c0 to %c256 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %1[%5] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.shr %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %1[%6] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c264 to %c1088 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %1[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c256 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %1[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.shr %felt_const_1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %2, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c264 to %c1080 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.shr %felt_const_128, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %2, %felt_const_1080 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <1088 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/pointbits_loopback.llzk b/examples/circom-demo/pointbits_loopback.llzk new file mode 100644 index 0000000..8480d50 --- /dev/null +++ b/examples/circom-demo/pointbits_loopback.llzk @@ -0,0 +1,2250 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Main_9::@Main_9<[]>>} { + function.def @sqrt_0(%arg0: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %felt_const_40770029410420498293352137776570907027550720424234931066070132305056 = felt.const 40770029410420498293352137776570907027550720424234931066070132305056 : <"babybear"> + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> + %felt_const_81540058820840996586704275553141814055101440848469862132140264610111 = felt.const 81540058820840996586704275553141814055101440848469862132140264610111 : <"babybear"> + %felt_const_19103219067921713944291392827692070036145651957329286315305642004821462161904 = felt.const 19103219067921713944291392827692070036145651957329286315305642004821462161904 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !felt.type<"babybear"> + %0 = bool.cmp eq(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = arith.select %0, %felt_const_0, %nondet : !felt.type<"babybear"> + %2 = scf.if %0 -> (!felt.type<"babybear">) { + scf.yield %1 : !felt.type<"babybear"> + } else { + %3 = felt.pow %arg0, %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = bool.cmp ne(%3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = arith.select %4, %felt_const_0, %1 : !felt.type<"babybear"> + %6 = scf.if %4 -> (!felt.type<"babybear">) { + scf.yield %5 : !felt.type<"babybear"> + } else { + %7 = felt.pow %arg0, %felt_const_81540058820840996586704275553141814055101440848469862132140264610111 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.pow %arg0, %felt_const_40770029410420498293352137776570907027550720424234931066070132305056 : !felt.type<"babybear">, !felt.type<"babybear"> + %9:4 = scf.while (%arg1 = %8, %arg2 = %felt_const_28, %arg3 = %felt_const_19103219067921713944291392827692070036145651957329286315305642004821462161904, %arg4 = %7) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %12 = bool.cmp ne(%arg1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = bool.cmp ne(%arg4, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = bool.and %12, %13 : i1, i1 + scf.condition(%14) %arg1, %arg2, %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">, %arg4: !felt.type<"babybear">): + %12 = felt.mul %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %13:2 = scf.while (%arg5 = %felt_const_1, %arg6 = %12) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %18 = bool.cmp ne(%arg6, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%18) %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">, %arg6: !felt.type<"babybear">): + %18 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.mul %arg6, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %14:2 = scf.while (%arg5 = %felt_const_0, %arg6 = %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %18 = felt.sub %arg2, %13#0 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %18, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = bool.cmp lt(%arg5, %19) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%20) %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">, %arg6: !felt.type<"babybear">): + %18 = felt.mul %arg6, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.add %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %15 = felt.mul %14#1, %14#1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %arg4, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.mul %arg1, %14#1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %17, %13#0, %15, %16 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + %10 = bool.cmp lt(%9#0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = scf.if %10 -> (!felt.type<"babybear">) { + %12 = felt.neg %9#0 : !felt.type<"babybear"> + scf.yield %12 : !felt.type<"babybear"> + } else { + scf.yield %9#0 : !felt.type<"babybear"> + } + scf.yield %11 : !felt.type<"babybear"> + } + scf.yield %6 : !felt.type<"babybear"> + } + function.return %2 : !felt.type<"babybear"> + } + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<254 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_2 { + struct.def @CompConstant_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@CompConstant_2::@CompConstant_2<[]>> + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_340282366920938463463374607431768211455, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = bool.and %23, %24 : i1, i1 + scf.if %25 { + %32 = felt.neg %arg2 : !felt.type<"babybear"> + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg2, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = bool.and %32, %33 : i1, i1 + scf.if %34 { + %35 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg5, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = bool.and %35, %true : i1, i1 + scf.if %36 { + %37 = felt.mul %arg2, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.add %40, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %37 = felt.neg %arg5 : !felt.type<"babybear"> + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %39, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %8 : !felt.type<"babybear"> + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + %26 = cast.toindex %8 : !felt.type<"babybear"> + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %arg4, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = felt.sub %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = felt.add %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %29, %31, %28, %30 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@sout] = %0#2 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0#2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %6 : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.writem %self[@num2bits] = %7 : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.writem %self[@parts] = %nondet : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> + function.return %self : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@parts] : <@CompConstant_2::@CompConstant_2<[]>>, !array.type<127 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@sout] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_2::@CompConstant_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_2::@CompConstant_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_340282366920938463463374607431768211455, %arg6 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.shr %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = bool.and %25, %26 : i1, i1 + scf.if %27 { + %34 = felt.neg %arg5 : !felt.type<"babybear"> + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %10 : !felt.type<"babybear"> + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = bool.and %34, %35 : i1, i1 + scf.if %36 { + %37 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = felt.mul %arg3, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = felt.add %44, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %46 = cast.toindex %10 : !felt.type<"babybear"> + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = bool.and %37, %true : i1, i1 + scf.if %38 { + %39 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %arg3, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = felt.add %42, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %10 : !felt.type<"babybear"> + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %39 = felt.neg %arg3 : !felt.type<"babybear"> + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.add %41, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %10 : !felt.type<"babybear"> + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + } + %28 = cast.toindex %10 : !felt.type<"babybear"> + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.add %arg6, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.sub %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.add %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %32, %33, %31, %30 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %2, %5#3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %3[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%3, %9) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @AliasCheck_3 { + struct.def @AliasCheck_3 { + struct.member @compConstant : !struct.type<@CompConstant_2::@CompConstant_2<[]>> + struct.member @compConstant$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %self = struct.new : <@AliasCheck_3::@AliasCheck_3<[]>> + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c254 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %5 = cast.toindex %1 : !felt.type<"babybear"> + array.write %4[%5] = %3 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %4 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %9 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %10 = function.call @CompConstant_2::@CompConstant_2::@compute(%9) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_2::@CompConstant_2<[]>> + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> + } + } + struct.writem %self[@compConstant$inputs] = %pod_0 : <@AliasCheck_3::@AliasCheck_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_2::@CompConstant_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> + struct.writem %self[@compConstant] = %0 : <@AliasCheck_3::@AliasCheck_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> + function.return %self : !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@compConstant] : <@AliasCheck_3::@AliasCheck_3<[]>>, !struct.type<@CompConstant_2::@CompConstant_2<[]>> + %1 = struct.readm %arg0[@compConstant$inputs] : <@AliasCheck_3::@AliasCheck_3<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c254 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %1[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + %9 = array.read %7[%8] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %9, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = struct.readm %0[@out] : <@CompConstant_2::@CompConstant_2<[]>>, !felt.type<"babybear"> + constrain.eq %2, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = pod.read %1[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> + function.call @CompConstant_2::@CompConstant_2::@constrain(%0, %3) : (!struct.type<@CompConstant_2::@CompConstant_2<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @CompConstant_4 { + struct.def @CompConstant_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg2, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %38, %40, %41, %39 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#0 : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_1::@Num2Bits_1::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %20 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_4::@CompConstant_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_4::@CompConstant_4<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_4::@CompConstant_4<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_4::@CompConstant_4<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_4::@CompConstant_4<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_4::@CompConstant_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg2, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %38, %39, %41, %40 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%11, %17) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_4::@CompConstant_4<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_340282366920938463463374607431768211455) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg5, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg3, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg5, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg2, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg5, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg3, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %28, %30, %31, %29 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#0 : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_4::@CompConstant_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_4::@CompConstant_4<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_4::@CompConstant_4<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_4::@CompConstant_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_4::@CompConstant_4<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_4::@CompConstant_4<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_4::@CompConstant_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_1, %arg6 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg6, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg4, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg3, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %30, %31, %33, %32 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%3, %9) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Point2Bits_Strict_5 { + struct.def @Point2Bits_Strict_5 { + struct.member @out : !array.type<256 x !felt.type<"babybear">> {llzk.pub} + struct.member @n2bY : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2bY$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @aliasCheckX : !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> + struct.member @aliasCheckX$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @signCalc : !struct.type<@CompConstant_4::@CompConstant_4<[]>> + struct.member @signCalc$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @n2bX : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2bX$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @aliasCheckY : !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> + struct.member @aliasCheckY$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c255 = arith.constant 255 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c254 = arith.constant {product_source = "compute"} 254 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %38 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %39 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%38) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %39 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %4 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %38 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %39 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%38) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %39 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %38 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %40[%41] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %44 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + array.write %43[%44] = %42 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %43 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %46 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %57 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%57) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %58 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %49 = struct.readm %48[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %49[%50] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + array.write %52[%53] = %51 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %52 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %55 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %57 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%57) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %58 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %38 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %40[%41] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %44 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + array.write %43[%44] = %42 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %43 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %45 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %46 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %pod_4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %49 = function.call @CompConstant_4::@CompConstant_4::@product(%48) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> + %50 = function.call @CompConstant_4::@CompConstant_4::@compute(%48) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %49 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %38 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %40[%41] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%43] = %42 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + array.write %nondet[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c255] = %9 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@aliasCheckY$inputs] = %pod_8 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckY] = %10 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@signCalc$inputs] = %pod_4 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@signCalc] = %11 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckX$inputs] = %pod_2 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckX] = %12 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@n2bX$inputs] = %pod_6 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bX] = %13 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bY$inputs] = %pod_0 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bY] = %14 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %15 = struct.readm %self[@out] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = struct.readm %self[@n2bY] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %17 = struct.readm %self[@n2bY$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = struct.readm %self[@aliasCheckX] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %19 = struct.readm %self[@aliasCheckX$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = struct.readm %self[@signCalc] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "constrain"} + %21 = struct.readm %self[@signCalc$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = struct.readm %self[@n2bX] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %23 = struct.readm %self[@n2bX$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %24 = struct.readm %self[@aliasCheckY] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %25 = struct.readm %self[@aliasCheckY$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %26 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %38 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %39 = struct.readm %22[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %39[%40] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = pod.read %19[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %42[%43] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = struct.readm %16[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = pod.read %25[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %48[%49] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %38 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %39 = struct.readm %22[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %39[%40] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = pod.read %21[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %42[%43] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %38 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %39 = struct.readm %16[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %39[%40] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %15[%42] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = array.read %15[%c254] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = struct.readm %20[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %15[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %25[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%24, %33) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %34 = pod.read %21[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_4::@CompConstant_4::@constrain(%20, %34) : (!struct.type<@CompConstant_4::@CompConstant_4<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %35 = pod.read %19[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%18, %35) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %36 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%22, %36) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %37 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%16, %37) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c255 = arith.constant 255 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c254 = arith.constant {product_source = "compute"} 254 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %15 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%15) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %16 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %4 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %15 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%15) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %17[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %20 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %34 = pod.read %pod_2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%34) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %35 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %25 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %26 = struct.readm %25[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %26[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %29[%30] = %28 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %29 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %32 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %34 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%34) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %35 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %17[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %20 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %23 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %26 = function.call @CompConstant_4::@CompConstant_4::@compute(%25) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %26 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %17 = struct.readm %16[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %17[%18] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%20] = %19 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + array.write %nondet[%c254] = %felt_const_0 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c255] = %9 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@aliasCheckY$inputs] = %pod_8 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckY] = %10 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@signCalc$inputs] = %pod_4 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@signCalc] = %11 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckX$inputs] = %pod_2 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckX] = %12 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@n2bX$inputs] = %pod_6 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bX] = %13 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bY$inputs] = %pod_0 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bY] = %14 : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c255 = arith.constant 255 : index + %c254 = arith.constant 254 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2bY] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2bY$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aliasCheckX] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aliasCheckX$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@signCalc] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@signCalc$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@n2bX] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@n2bX$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %9 = struct.readm %arg0[@aliasCheckY] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@aliasCheckY$inputs] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %33[%34] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %6[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %0[%27] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %15 = array.read %0[%c254] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %5[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%9, %18) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %19 = pod.read %6[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_4::@CompConstant_4::@constrain(%5, %19) : (!struct.type<@CompConstant_4::@CompConstant_4<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %20 = pod.read %4[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%3, %20) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %21 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%7, %21) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %22 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %22) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_6 { + struct.def @Bits2Num_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg5, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %13, %12 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c254 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c254 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @BabyCheck_7 { + struct.def @BabyCheck_7 { + struct.member @x2 : !felt.type<"babybear"> + struct.member @y2 : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@BabyCheck_7::@BabyCheck_7<[]>> + %0 = felt.mul %arg0, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@x2] = %0 : <@BabyCheck_7::@BabyCheck_7<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@y2] = %1 : <@BabyCheck_7::@BabyCheck_7<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_168696 = felt.const 168696 : <"babybear"> + %felt_const_168700 = felt.const 168700 : <"babybear"> + %0 = struct.readm %arg0[@x2] : <@BabyCheck_7::@BabyCheck_7<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@y2] : <@BabyCheck_7::@BabyCheck_7<[]>>, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %0, %felt_const_168700 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.mul %0, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.mul %6, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @Bits2Point_Strict_8 { + struct.def @Bits2Point_Strict_8 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @signCalc : !struct.type<@CompConstant_4::@CompConstant_4<[]>> + struct.member @signCalc$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @n2bX : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2bX$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @babyCheck : !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> + struct.member @babyCheck$inputs : !pod.type<[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> + struct.member @aliasCheckY : !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> + struct.member @aliasCheckY$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @aliasCheckX : !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> + struct.member @aliasCheckX$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + struct.member @b2nY : !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> + struct.member @b2nY$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c255 = arith.constant 255 : index + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "compute"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %arg0[%72] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %74 = pod.read %pod_6[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %74[%75] = %73 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %74 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %77 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %79 = pod.read %pod_6[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%79) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %arg0[%72] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %74 = pod.read %pod_10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %74[%75] = %73 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@in] = %74 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %77 = arith.subi %76, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %77 : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.cmpi eq, %77, %c0 {product_source = "compute"} : index + scf.if %78 { + %79 = pod.read %pod_10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Bits2Num_6::@Bits2Num_6::@product(%79) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> + %81 = function.call @Bits2Num_6::@Bits2Num_6::@compute(%79) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %80 : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %4, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.sub %felt_const_168700, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.div %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @sqrt_0(%8) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = bool.cmp eq(%10, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %71 = felt.neg %9 : !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %71 : !felt.type<"babybear"> + } else { + scf.yield {product_source = "compute"} %9 : !felt.type<"babybear"> + } {product_source = "compute"} + array.write %nondet[%c0] = %12 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@x] = %13 : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %15 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %71 = pod.read %pod_4[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_4[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = function.call @BabyCheck_7::@BabyCheck_7::@compute(%71, %72) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %73 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %17 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@y] = %17 : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %19 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %71 = pod.read %pod_4[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_4[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = function.call @BabyCheck_7::@BabyCheck_7::@compute(%71, %72) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %73 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %21 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %21 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %71 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = function.call @Num2Bits_0::@Num2Bits_0::@product(%71) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %73 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%71) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %72 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %74 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %73[%74] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %76 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %77 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %76[%77] = %75 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %76 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %79 = arith.subi %78, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %79 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %80 = arith.cmpi eq, %79, %c0 {product_source = "compute"} : index + scf.if %80 { + %81 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %82 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%81) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %82 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %73 = struct.readm %72[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %74 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + %75 = array.read %73[%74] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %76 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %77 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "compute"} + array.write %76[%77] = %75 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %76 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %79 = arith.subi %78, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %79 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %80 = arith.cmpi eq, %79, %c0 {product_source = "compute"} : index + scf.if %80 { + %81 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %82 = function.call @CompConstant_4::@CompConstant_4::@product(%81) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> + %83 = function.call @CompConstant_4::@CompConstant_4::@compute(%81) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %82 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aliasCheckX$inputs] = %pod_8 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckX] = %25 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@signCalc$inputs] = %pod_0 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@signCalc] = %26 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@n2bX$inputs] = %pod_2 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bX] = %27 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckY$inputs] = %pod_6 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckY] = %28 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@b2nY$inputs] = %pod_10 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + struct.writem %self[@b2nY] = %29 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + struct.writem %self[@babyCheck$inputs] = %pod_4 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> {product_source = "compute"} + %30 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + struct.writem %self[@babyCheck] = %30 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = struct.readm %self[@out] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = struct.readm %self[@signCalc] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "constrain"} + %33 = struct.readm %self[@signCalc$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = struct.readm %self[@n2bX] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %35 = struct.readm %self[@n2bX$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = struct.readm %self[@babyCheck] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@babyCheck$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = struct.readm %self[@aliasCheckY] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@aliasCheckY$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@aliasCheckX] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@aliasCheckX$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@b2nY] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@b2nY$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %arg0[%72] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %74 = pod.read %39[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %74[%75] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %76, %73 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = array.read %arg0[%c254] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %72 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %73 = array.read %arg0[%72] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %74 = pod.read %43[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %75 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %74[%75] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %76, %73 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %45 = struct.readm %42[@out] : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %31[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %31[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %31[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %47, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %felt_const_1, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %49, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %felt_const_168700, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.div %50, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = function.call @sqrt_0(%53) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %arg0[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %31[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = pod.read %37[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %31[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %59 = pod.read %37[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = array.read %31[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %61 = pod.read %35[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %60 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %72 = struct.readm %34[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %73 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %74 = array.read %72[%73] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = pod.read %41[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %75[%76] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %71 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %72 = struct.readm %34[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %73 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %74 = array.read %72[%73] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %75 = pod.read %33[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = cast.toindex %71 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %75[%76] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %74 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %62 = struct.readm %32[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %63 = array.read %arg0[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %62, %63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %41[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%40, %64) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %65 = pod.read %33[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_4::@CompConstant_4::@constrain(%32, %65) : (!struct.type<@CompConstant_4::@CompConstant_4<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %66 = pod.read %35[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%34, %66) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %67 = pod.read %39[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%38, %67) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %68 = pod.read %43[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_6::@Bits2Num_6::@constrain(%42, %68) : (!struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %69 = pod.read %37[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %70 = pod.read %37[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @BabyCheck_7::@BabyCheck_7::@constrain(%36, %69, %70) : (!struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> + } + function.def @compute(%arg0: !array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c255 = arith.constant 255 : index + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "compute"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %31 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %arg0[%32] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_6[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35] = %33 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %34 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %37 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %pod_6[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %40 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%39) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %40 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %31 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %arg0[%32] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %34[%35] = %33 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@in] = %34 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %37 : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %pod_10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %40 = function.call @Bits2Num_6::@Bits2Num_6::@compute(%39) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %40 : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %felt_const_1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %4, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.sub %felt_const_168700, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.div %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @sqrt_0(%8) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = bool.cmp eq(%10, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %31 = felt.neg %9 : !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %31 : !felt.type<"babybear"> + } else { + scf.yield {product_source = "compute"} %9 : !felt.type<"babybear"> + } {product_source = "compute"} + array.write %nondet[%c0] = %12 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@x] = %13 : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %15 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %31 = pod.read %pod_4[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod_4[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @BabyCheck_7::@BabyCheck_7::@compute(%31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %33 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %17 = array.read %nondet[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@y] = %17 : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %19 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %31 = pod.read %pod_4[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod_4[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = function.call @BabyCheck_7::@BabyCheck_7::@compute(%31, %32) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %33 : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %21 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %21 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %31 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%31) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %31 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %33 = struct.readm %32[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %33[%34] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %36 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %39 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @AliasCheck_3::@AliasCheck_3::@compute(%41) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %42 : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %31 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %33 = struct.readm %32[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %33[%34] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %37 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "compute"} + array.write %36[%37] = %35 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %36 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %39 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %41 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %42 = function.call @CompConstant_4::@CompConstant_4::@compute(%41) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %42 : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aliasCheckX$inputs] = %pod_8 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckX] = %25 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@signCalc$inputs] = %pod_0 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_4::@CompConstant_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@signCalc] = %26 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "compute"} + struct.writem %self[@n2bX$inputs] = %pod_2 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bX] = %27 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckY$inputs] = %pod_6 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@aliasCheckY] = %28 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "compute"} + struct.writem %self[@b2nY$inputs] = %pod_10 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + struct.writem %self[@b2nY] = %29 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "compute"} + struct.writem %self[@babyCheck$inputs] = %pod_4 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> {product_source = "compute"} + %30 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + struct.writem %self[@babyCheck] = %30 : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, %arg1: !array.type<256 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c255 = arith.constant 255 : index + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %felt_const_168696 = felt.const 168696 : <"babybear"> {product_source = "constrain"} + %felt_const_168700 = felt.const 168700 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@signCalc] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@CompConstant_4::@CompConstant_4<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@signCalc$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2bX] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2bX$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = struct.readm %arg0[@babyCheck] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@BabyCheck_7::@BabyCheck_7<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@babyCheck$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]> {product_source = "constrain"} + %7 = struct.readm %arg0[@aliasCheckY] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@aliasCheckY$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@aliasCheckX] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@AliasCheck_3::@AliasCheck_3<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@aliasCheckX$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@b2nY] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !struct.type<@Bits2Num_6::@Bits2Num_6<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@b2nY$inputs] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %40 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %arg1[%41] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = pod.read %8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %13 = array.read %arg1[%c254] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %40 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %arg1[%41] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = pod.read %12[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = struct.readm %11[@out] : <@Bits2Num_6::@Bits2Num_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %felt_const_1, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %18, %felt_const_168696 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.sub %felt_const_168700, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.div %19, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = function.call @sqrt_0(%22) : (!felt.type<"babybear">) -> !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %6[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %6[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %40 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %41 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %41[%42] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = pod.read %10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %44[%45] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %40 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %41 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %41[%42] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %44[%45] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %31 = struct.readm %1[@out] : <@CompConstant_4::@CompConstant_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg1[%c255] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %10[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%9, %33) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %34 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_4::@CompConstant_4::@constrain(%1, %34) : (!struct.type<@CompConstant_4::@CompConstant_4<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %35 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %35) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %36 = pod.read %8[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @AliasCheck_3::@AliasCheck_3::@constrain(%7, %36) : (!struct.type<@AliasCheck_3::@AliasCheck_3<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %37 = pod.read %12[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_6::@Bits2Num_6::@constrain(%11, %37) : (!struct.type<@Bits2Num_6::@Bits2Num_6<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %38 = pod.read %6[@x] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = pod.read %6[@y] : <[@x: !felt.type<"babybear">, @y: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @BabyCheck_7::@BabyCheck_7::@constrain(%5, %38, %39) : (!struct.type<@BabyCheck_7::@BabyCheck_7<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Main_9 { + struct.def @Main_9 { + struct.member @p2b : !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> + struct.member @p2b$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + struct.member @b2p : !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> + struct.member @b2p$inputs : !pod.type<[@in: !array.type<256 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Main_9::@Main_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c256 = arith.constant {product_source = "compute"} 256 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Main_9::@Main_9<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c256 } : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<256 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %30 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@product(%30) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> + %32 = function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@compute(%30) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %31 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %30 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@compute(%30) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %31 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = struct.readm %self[@p2b] : <@Main_9::@Main_9<[]>>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@p2b$inputs] : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = struct.readm %self[@b2p] : <@Main_9::@Main_9<[]>>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@b2p$inputs] : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<256 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %30 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %32[%33] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = pod.read %pod_2[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %35[%36] = %34 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %35 : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.subi %37, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %38 : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.cmpi eq, %38, %c0 {product_source = "compute"} : index + scf.if %39 { + %47 = pod.read %pod_2[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @Bits2Point_Strict_8::@Bits2Point_Strict_8::@product(%47) : (!array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> + %49 = function.call @Bits2Point_Strict_8::@Bits2Point_Strict_8::@compute(%47) : (!array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %48 : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %40 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %41 = struct.readm %10[@out] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %41[%42] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = pod.read %13[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %44[%45] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@p2b$inputs] = %pod_0 : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + struct.writem %self[@p2b] = %20 : <@Main_9::@Main_9<[]>>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + struct.writem %self[@b2p$inputs] = %pod_2 : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<256 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + struct.writem %self[@b2p] = %21 : <@Main_9::@Main_9<[]>>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + %22 = struct.readm %12[@out] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = struct.readm %12[@out] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = array.read %25[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@constrain(%10, %28) : (!struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %29 = pod.read %13[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Point_Strict_8::@Bits2Point_Strict_8::@constrain(%12, %29) : (!struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<256 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Main_9::@Main_9<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Main_9::@Main_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c256 = arith.constant {product_source = "compute"} 256 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Main_9::@Main_9<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c256 } : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<256 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c256 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @Bits2Point_Strict_8::@Bits2Point_Strict_8::@compute(%22) : (!array.type<256 x !felt.type<"babybear">>) -> !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@p2b$inputs] = %pod_0 : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + struct.writem %self[@p2b] = %10 : <@Main_9::@Main_9<[]>>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "compute"} + struct.writem %self[@b2p$inputs] = %pod_2 : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<256 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + struct.writem %self[@b2p] = %11 : <@Main_9::@Main_9<[]>>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Main_9::@Main_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Main_9::@Main_9<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c256 = arith.constant 256 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@p2b] : <@Main_9::@Main_9<[]>>, !struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>> {product_source = "constrain"} + %1 = struct.readm %arg0[@p2b$inputs] : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %2 = struct.readm %arg0[@b2p] : <@Main_9::@Main_9<[]>>, !struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@b2p$inputs] : <@Main_9::@Main_9<[]>>, !pod.type<[@in: !array.type<256 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = pod.read %1[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = array.read %5[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %1[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c256 step %c1 { + %18 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = struct.readm %0[@out] : <@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %3[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %22[%23] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = struct.readm %2[@out] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = array.read %10[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %2[@out] : <@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %1[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Point2Bits_Strict_5::@Point2Bits_Strict_5::@constrain(%0, %16) : (!struct.type<@Point2Bits_Strict_5::@Point2Bits_Strict_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %17 = pod.read %3[@in] : <[@in: !array.type<256 x !felt.type<"babybear">>]>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Point_Strict_8::@Bits2Point_Strict_8::@constrain(%2, %17) : (!struct.type<@Bits2Point_Strict_8::@Bits2Point_Strict_8<[]>>, !array.type<256 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/queryTest.llzk b/examples/circom-demo/queryTest.llzk new file mode 100644 index 0000000..21133e9 --- /dev/null +++ b/examples/circom-demo/queryTest.llzk @@ -0,0 +1,2020 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Query_9::@Query_9<[]>>} { + poly.template @IsZero_0 { + struct.def @IsZero_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_0::@IsZero_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_0::@IsZero_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsEqual_1 { + struct.def @IsEqual_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_0::@IsZero_0<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @IsZero_0::@IsZero_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> + %20 = function.call @IsZero_0::@IsZero_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@isz] : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@isz$inputs] : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_0::@IsZero_0::@constrain(%10, %17) : (!struct.type<@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @IsZero_0::@IsZero_0::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_0::@IsZero_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isz] : <@IsEqual_1::@IsEqual_1<[]>>, !struct.type<@IsZero_0::@IsZero_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_1::@IsEqual_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_0::@IsZero_0::@constrain(%1, %8) : (!struct.type<@IsZero_0::@IsZero_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_3 { + struct.def @LessThan_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_2::@Num2Bits_2::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %26 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%13, %23) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_3::@LessThan_3<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_3::@LessThan_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_3::@LessThan_3<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_3::@LessThan_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_3::@LessThan_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%1, %11) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_4 { + struct.def @GreaterThan_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_3::@LessThan_3<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_3::@LessThan_3::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> + %26 = function.call @LessThan_3::@LessThan_3::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_3::@LessThan_3::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_3::@LessThan_3::@constrain(%14, %23) : (!struct.type<@LessThan_3::@LessThan_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_3::@LessThan_3::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_3::@LessThan_3::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_4::@GreaterThan_4<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_4::@GreaterThan_4<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_3::@LessThan_3::@constrain(%1, %10) : (!struct.type<@LessThan_3::@LessThan_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IN_5 { + struct.def @IN_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @gt : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + struct.member @gt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + struct.member @eq : !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> + struct.member @eq$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@IN_5::@IN_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_0 = felt.const 0 : <"babybear"> + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@IN_5::@IN_5<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %12 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %12 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %0 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %array_1[%13] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %15[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %array_1[%16] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %17[@in] = %15 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %18 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_1[%18] = %17 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %array[%19] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.subi %21, %c1 : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.cmpi eq, %22, %c0 : index + scf.if %23 { + %42 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %43 = function.call @IsEqual_1::@IsEqual_1::@compute(%42) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> + pod.write %20[@comp] = %43 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %44 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%44] = %20 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + } + %24 = cast.toindex %12 : !felt.type<"babybear"> + %25 = array.read %arg1[%24] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = cast.toindex %12 : !felt.type<"babybear"> + %27 = array.read %array_1[%26] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %28 = pod.read %27[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %28[%c1] = %25 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %12 : !felt.type<"babybear"> + %30 = array.read %array_1[%29] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %30[@in] = %28 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %31 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_1[%31] = %30 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %32 = cast.toindex %12 : !felt.type<"babybear"> + %33 = array.read %array[%32] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + %34 = pod.read %33[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.subi %34, %c1 : index + pod.write %33[@count] = %35 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index + %36 = arith.cmpi eq, %35, %c0 : index + scf.if %36 { + %42 = pod.read %30[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %43 = function.call @IsEqual_1::@IsEqual_1::@compute(%42) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> + pod.write %33[@comp] = %43 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %44 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%44] = %33 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + } + %37 = cast.toindex %12 : !felt.type<"babybear"> + %38 = array.read %array[%37] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %40 = struct.readm %39[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> + %41 = felt.add %arg3, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %41 : !felt.type<"babybear"> + } + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + } + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %5[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + } + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + %10 = struct.readm %9[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@gt$inputs] = %pod_0 : <@IN_5::@IN_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + struct.writem %self[@gt] = %11 : <@IN_5::@IN_5<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + struct.writem %self[@eq$inputs] = %array_1 : <@IN_5::@IN_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_2 = array.new : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %12 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + array.write %array_2[%arg2] = %13 : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + } + struct.writem %self[@eq] = %array_2 : <@IN_5::@IN_5<[]>>, !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> + function.return %self : !struct.type<@IN_5::@IN_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@IN_5::@IN_5<[]>>, %arg1: !felt.type<"babybear">, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c3 = arith.constant 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@gt] : <@IN_5::@IN_5<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + %2 = struct.readm %arg0[@gt$inputs] : <@IN_5::@IN_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@eq] : <@IN_5::@IN_5<[]>>, !array.type<3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>> + %4 = struct.readm %arg0[@eq$inputs] : <@IN_5::@IN_5<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %5 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %felt_const_0) -> (!felt.type<"babybear">) { + %12 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %4[%13] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %16 = array.read %15[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %12 : !felt.type<"babybear"> + %18 = array.read %arg2[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %4[%19] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %21 = pod.read %20[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %22 = array.read %21[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %12 : !felt.type<"babybear"> + %24 = array.read %3[%23] : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %25 = struct.readm %24[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> + %26 = felt.add %arg4, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %26 : !felt.type<"babybear"> + } + %6 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %9, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = struct.readm %1[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @GreaterThan_4::@GreaterThan_4::@constrain(%1, %11) : (!struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + scf.for %arg3 = %c0 to %c3 step %c1 { + %12 = array.read %3[%arg3] : <3 x !struct.type<@IsEqual_1::@IsEqual_1<[]>>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %13 = array.read %4[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @IsEqual_1::@IsEqual_1::@constrain(%12, %14) : (!struct.type<@IsEqual_1::@IsEqual_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @MultiMux3_6 { + struct.def @MultiMux3_6 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a210 : !array.type<1 x !felt.type<"babybear">> + struct.member @a21 : !array.type<1 x !felt.type<"babybear">> + struct.member @a20 : !array.type<1 x !felt.type<"babybear">> + struct.member @a2 : !array.type<1 x !felt.type<"babybear">> + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,8 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux3_6::@MultiMux3_6<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_4 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_6 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_7 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux3_6::@MultiMux3_6<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + %3 = array.read %arg0[%c0, %c7] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %arg0[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = array.read %arg0[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.mul %17, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_6[%c0] = %18 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %arg0[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.sub %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.sub %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_7[%c0] = %27 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = array.read %arg0[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.sub %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.add %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.mul %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %36 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = felt.sub %37, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %39 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = array.read %arg0[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = felt.mul %46, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %47 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.mul %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %52 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %53 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = felt.sub %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = felt.mul %55, %56 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_5[%c0] = %57 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %58 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %59 = array.read %nondet_6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = array.read %nondet_7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %61 = felt.add %59, %60 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %63 = felt.add %61, %62 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = array.read %nondet_3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.add %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.mul %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %69 = array.read %nondet_4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = felt.add %68, %69 : !felt.type<"babybear">, !felt.type<"babybear"> + %71 = array.read %nondet_5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %72 = felt.add %70, %71 : !felt.type<"babybear">, !felt.type<"babybear"> + %73 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %74 = felt.add %72, %73 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = felt.add %67, %74 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %75 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a210] = %nondet_6 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a21] = %nondet_7 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a20] = %nondet_2 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a2] = %nondet_3 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a10] = %nondet : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet_4 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet_5 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_0 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_1 : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, %arg1: !array.type<1,8 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a210] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a21] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a20] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a2] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@a10] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %6 = struct.readm %arg0[@a1] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %7 = struct.readm %arg0[@a0] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %8 = struct.readm %arg0[@a] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %9 = struct.readm %arg0[@s10] : <@MultiMux3_6::@MultiMux3_6<[]>>, !felt.type<"babybear"> + %10 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.mul %10, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %9, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %13 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%13) + } do { + %13 = array.read %arg1[%c0, %c7] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.sub %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg1[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.add %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %arg1[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.sub %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.sub %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.mul %27, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg1[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.sub %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.sub %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.mul %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %39, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = array.read %arg1[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = felt.mul %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %49, %48 : !felt.type<"babybear">, !felt.type<"babybear"> + %50 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %51 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %53, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = array.read %arg1[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %56 = felt.sub %54, %55 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = felt.sub %56, %57 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = felt.add %58, %59 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = felt.mul %60, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %62, %61 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %64 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.sub %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.mul %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %68, %67 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %71 = felt.sub %69, %70 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %73 = felt.mul %71, %72 : !felt.type<"babybear">, !felt.type<"babybear"> + %74 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %74, %73 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %76, %75 : !felt.type<"babybear">, !felt.type<"babybear"> + %77 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %78 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %79 = felt.add %77, %78 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %81 = felt.add %79, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %83 = felt.add %81, %82 : !felt.type<"babybear">, !felt.type<"babybear"> + %84 = array.read %arg2[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %85 = felt.mul %83, %84 : !felt.type<"babybear">, !felt.type<"babybear"> + %86 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %87 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %88 = felt.add %86, %87 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %90 = felt.add %88, %89 : !felt.type<"babybear">, !felt.type<"babybear"> + %91 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = felt.add %90, %91 : !felt.type<"babybear">, !felt.type<"babybear"> + %93 = felt.add %85, %92 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %94, %93 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux3_7 { + struct.def @Mux3_7 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %self = struct.new : <@Mux3_7::@Mux3_7<[]>> + %pod = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c8 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = function.call @MultiMux3_6::@MultiMux3_6::@compute(%12, %13) : (!array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + } + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = function.call @MultiMux3_6::@MultiMux3_6::@compute(%12, %13) : (!array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + %1 = struct.readm %0[@out] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux3_7::@Mux3_7<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux3_7::@Mux3_7<[]>>, !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + struct.writem %self[@mux] = %3 : <@Mux3_7::@Mux3_7<[]>>, !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + function.return %self : !struct.type<@Mux3_7::@Mux3_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux3_7::@Mux3_7<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux3_7::@Mux3_7<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux3_7::@Mux3_7<[]>>, !struct.type<@MultiMux3_6::@MultiMux3_6<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux3_7::@Mux3_7<[]>>, !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @MultiMux3_6::@MultiMux3_6::@constrain(%1, %5, %6) : (!struct.type<@MultiMux3_6::@MultiMux3_6<[]>>, !array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_8 { + struct.def @Num2Bits_8 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Query_9 { + struct.def @Query_9 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_3::@LessThan_3<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + struct.member @n2b : !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @inComp : !struct.type<@IN_5::@IN_5<[]>> + struct.member @inComp$inputs : !pod.type<[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> + struct.member @gt : !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + struct.member @gt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + struct.member @eq : !struct.type<@IsEqual_1::@IsEqual_1<[]>> + struct.member @eq$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + struct.member @mux : !struct.type<@Mux3_7::@Mux3_7<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Query_9::@Query_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c3 = arith.constant 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c11 = arith.constant {product_source = "compute"} 11 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Query_9::@Query_9<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %2 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %178 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @IsEqual_1::@IsEqual_1::@product(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> + %180 = function.call @IsEqual_1::@IsEqual_1::@compute(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %5[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %7 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %178 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @IsEqual_1::@IsEqual_1::@compute(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %179 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %9[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %178 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @LessThan_3::@LessThan_3::@product(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> + %180 = function.call @LessThan_3::@LessThan_3::@compute(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %14[%c1] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %14 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %178 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @LessThan_3::@LessThan_3::@compute(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %179 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %18 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %18[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %18 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %20 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %178 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @GreaterThan_4::@GreaterThan_4::@product(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> + %180 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %22 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %23 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %25 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %178 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %179 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%178) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %179 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_4[@in] = %arg1 : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %28 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %178 = pod.read %pod_4[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "compute"} + %179 = pod.read %pod_4[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @IN_5::@IN_5::@compute(%178, %179) : (!felt.type<"babybear">, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %180 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %178 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %179 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "compute"} + %180 = array.read %arg0[%179] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %181 = pod.read %pod_4[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %182 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "compute"} + array.write %181[%182] = %180 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@value] = %181 : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %183 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %184 = arith.subi %183, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %184 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %185 = arith.cmpi eq, %184, %c0 {product_source = "compute"} : index + scf.if %185 { + %186 = pod.read %pod_4[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "compute"} + %187 = pod.read %pod_4[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %188 = function.call @IN_5::@IN_5::@compute(%186, %187) : (!felt.type<"babybear">, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %188 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_2[@in] = %arg2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %178 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %179 = function.call @Num2Bits_8::@Num2Bits_8::@product(%178) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> + %180 = function.call @Num2Bits_8::@Num2Bits_8::@compute(%178) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %179 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %33 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %34 = struct.readm %33[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %35 = array.read %34[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %36[%c0] = %35 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@s] = %36 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.subi %37, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %38 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.cmpi eq, %38, %c0 {product_source = "compute"} : index + scf.if %39 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %40 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = array.read %41[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %43[%c1] = %42 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@s] = %43 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %45 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %47 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %48 = struct.readm %47[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = array.read %48[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %50[%c2] = %49 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@s] = %50 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %52 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %54 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %54[%c0] = %felt_const_1 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %54 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.subi %55, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %56 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.cmpi eq, %56, %c0 {product_source = "compute"} : index + scf.if %57 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %58 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %60[%c1] = %59 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %60 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %61 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.subi %61, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %62 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.cmpi eq, %62, %c0 {product_source = "compute"} : index + scf.if %63 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %64 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %65 = struct.readm %64[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %66[%c2] = %65 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %66 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %68 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %70 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %71 = struct.readm %70[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %72[%c3] = %71 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %72 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %74 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %76 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + %77 = struct.readm %76[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %78[%c4] = %77 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %78 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %80 = arith.subi %79, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %80 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %81 = arith.cmpi eq, %80, %c0 {product_source = "compute"} : index + scf.if %81 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %82 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.sub %felt_const_1, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %85[%c5] = %84 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %85 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %87 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %89 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %89[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %89 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %90 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %91 = arith.subi %90, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %91 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.cmpi eq, %91, %c0 {product_source = "compute"} : index + scf.if %92 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %93 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %93[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %93 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %94 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %95 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %178 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %179 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %180 = function.call @Mux3_7::@Mux3_7::@compute(%178, %179) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %180 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %97 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@Mux3_7::@Mux3_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %98 : <@Query_9::@Query_9<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@eq$inputs] = %pod_8 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %99 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + struct.writem %self[@eq] = %99 : <@Query_9::@Query_9<[]>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %100 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %100 : <@Query_9::@Query_9<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_10 : <@Query_9::@Query_9<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %101 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %101 : <@Query_9::@Query_9<[]>>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + struct.writem %self[@inComp$inputs] = %pod_4 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %102 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + struct.writem %self[@inComp] = %102 : <@Query_9::@Query_9<[]>>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %103 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %103 : <@Query_9::@Query_9<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@gt$inputs] = %pod_6 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %104 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + struct.writem %self[@gt] = %104 : <@Query_9::@Query_9<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %105 = struct.readm %self[@out] : <@Query_9::@Query_9<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %106 = struct.readm %self[@lt] : <@Query_9::@Query_9<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "constrain"} + %107 = struct.readm %self[@lt$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %108 = struct.readm %self[@n2b] : <@Query_9::@Query_9<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "constrain"} + %109 = struct.readm %self[@n2b$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %110 = struct.readm %self[@inComp] : <@Query_9::@Query_9<[]>>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "constrain"} + %111 = struct.readm %self[@inComp$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %112 = struct.readm %self[@gt] : <@Query_9::@Query_9<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "constrain"} + %113 = struct.readm %self[@gt$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %114 = struct.readm %self[@eq] : <@Query_9::@Query_9<[]>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "constrain"} + %115 = struct.readm %self[@eq$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %116 = struct.readm %self[@mux] : <@Query_9::@Query_9<[]>>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "constrain"} + %117 = struct.readm %self[@mux$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %118 = pod.read %115[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = array.read %118[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %119, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %120 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %121 = pod.read %115[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %122 = array.read %121[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %122, %120 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %123 = pod.read %107[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %124 = array.read %123[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %124, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %125 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %126 = pod.read %107[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = array.read %126[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %127, %125 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %128 = pod.read %113[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = array.read %128[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %129, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %130 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %131 = pod.read %113[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = array.read %131[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %132, %130 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %133 = pod.read %111[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %133, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %178 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %179 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %arg0[%179] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %181 = pod.read %111[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %182 = cast.toindex %178 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %181[%182] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %183, %180 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %134 = pod.read %109[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %134, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %135 = struct.readm %108[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = array.read %135[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %137 = pod.read %117[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = array.read %137[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %138, %136 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %139 = struct.readm %108[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = array.read %139[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = pod.read %117[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = array.read %141[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %142, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %143 = struct.readm %108[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = array.read %143[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %145 = pod.read %117[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = array.read %145[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %146, %144 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %147 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %148 = array.read %147[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %148, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %149 = struct.readm %114[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %150 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = array.read %150[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %151, %149 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %152 = struct.readm %106[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %153 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %154 = array.read %153[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %154, %152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %155 = struct.readm %112[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %156 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = array.read %156[%c3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %157, %155 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = struct.readm %110[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = array.read %159[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %160, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = struct.readm %110[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %162 = felt.sub %felt_const_1, %161 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = array.read %163[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %164, %162 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = array.read %165[%c6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %166, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %167 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %168 = array.read %167[%c7] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = struct.readm %116[@out] : <@Mux3_7::@Mux3_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %105, %169 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = pod.read %115[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_1::@IsEqual_1::@constrain(%114, %170) : (!struct.type<@IsEqual_1::@IsEqual_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %171 = pod.read %107[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_3::@LessThan_3::@constrain(%106, %171) : (!struct.type<@LessThan_3::@LessThan_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %172 = pod.read %117[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = pod.read %117[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux3_7::@Mux3_7::@constrain(%116, %172, %173) : (!struct.type<@Mux3_7::@Mux3_7<[]>>, !array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %174 = pod.read %111[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "constrain"} + %175 = pod.read %111[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IN_5::@IN_5::@constrain(%110, %174, %175) : (!struct.type<@IN_5::@IN_5<[]>>, !felt.type<"babybear">, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %176 = pod.read %109[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_8::@Num2Bits_8::@constrain(%108, %176) : (!struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %177 = pod.read %113[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_4::@GreaterThan_4::@constrain(%112, %177) : (!struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Query_9::@Query_9<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Query_9::@Query_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c3 = arith.constant 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c11 = arith.constant {product_source = "compute"} 11 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Query_9::@Query_9<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %2 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %105 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %106 = function.call @IsEqual_1::@IsEqual_1::@compute(%105) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %106 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %5[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %7 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %105 = pod.read %pod_8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %106 = function.call @IsEqual_1::@IsEqual_1::@compute(%105) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %106 : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %9[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %105 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %106 = function.call @LessThan_3::@LessThan_3::@compute(%105) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %106 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %14[%c1] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %14 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %105 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %106 = function.call @LessThan_3::@LessThan_3::@compute(%105) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %106 : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %18 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %18[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %18 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %20 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %105 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %106 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%105) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %106 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %22 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %23 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %25 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %105 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %106 = function.call @GreaterThan_4::@GreaterThan_4::@compute(%105) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %106 : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_4[@in] = %arg1 : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %28 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %105 = pod.read %pod_4[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "compute"} + %106 = pod.read %pod_4[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @IN_5::@IN_5::@compute(%105, %106) : (!felt.type<"babybear">, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %107 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %105 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + %107 = array.read %arg0[%106] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %108 = pod.read %pod_4[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %109 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + array.write %108[%109] = %107 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@value] = %108 : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %110 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %111 = arith.subi %110, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %111 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %112 = arith.cmpi eq, %111, %c0 {product_source = "compute"} : index + scf.if %112 { + %113 = pod.read %pod_4[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "compute"} + %114 = pod.read %pod_4[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %115 = function.call @IN_5::@IN_5::@compute(%113, %114) : (!felt.type<"babybear">, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %115 : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_2[@in] = %arg2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %105 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %106 = function.call @Num2Bits_8::@Num2Bits_8::@compute(%105) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %106 : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %33 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %34 = struct.readm %33[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %35 = array.read %34[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %36[%c0] = %35 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@s] = %36 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.subi %37, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %38 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.cmpi eq, %38, %c0 {product_source = "compute"} : index + scf.if %39 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %40 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = array.read %41[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %43[%c1] = %42 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@s] = %43 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %45 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %47 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + %48 = struct.readm %47[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = array.read %48[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %50[%c2] = %49 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@s] = %50 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %52 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %54 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %54[%c0] = %felt_const_1 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %54 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.subi %55, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %56 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.cmpi eq, %56, %c0 {product_source = "compute"} : index + scf.if %57 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %58 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %60[%c1] = %59 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %60 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %61 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.subi %61, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %62 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.cmpi eq, %62, %c0 {product_source = "compute"} : index + scf.if %63 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %64 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + %65 = struct.readm %64[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %66[%c2] = %65 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %66 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %67 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %68 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %70 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + %71 = struct.readm %70[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %72[%c3] = %71 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %72 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %74 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %76 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + %77 = struct.readm %76[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %78 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %78[%c4] = %77 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %78 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %80 = arith.subi %79, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %80 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %81 = arith.cmpi eq, %80, %c0 {product_source = "compute"} : index + scf.if %81 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %82 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %84 = felt.sub %felt_const_1, %83 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %85[%c5] = %84 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %85 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %87 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %89 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %89[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %89 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %90 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %91 = arith.subi %90, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %91 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.cmpi eq, %91, %c0 {product_source = "compute"} : index + scf.if %92 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %93 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %93[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@c] = %93 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %94 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %95 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %105 = pod.read %pod_10[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %106 = pod.read %pod_10[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @Mux3_7::@Mux3_7::@compute(%105, %106) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %97 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + %98 = struct.readm %97[@out] : <@Mux3_7::@Mux3_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %98 : <@Query_9::@Query_9<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@eq$inputs] = %pod_8 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %99 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_1::@IsEqual_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + struct.writem %self[@eq] = %99 : <@Query_9::@Query_9<[]>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %100 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_3::@LessThan_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %100 : <@Query_9::@Query_9<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_10 : <@Query_9::@Query_9<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %101 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@Mux3_7::@Mux3_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %101 : <@Query_9::@Query_9<[]>>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "compute"} + struct.writem %self[@inComp$inputs] = %pod_4 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %102 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@IN_5::@IN_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + struct.writem %self[@inComp] = %102 : <@Query_9::@Query_9<[]>>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %103 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %103 : <@Query_9::@Query_9<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "compute"} + struct.writem %self[@gt$inputs] = %pod_6 : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %104 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + struct.writem %self[@gt] = %104 : <@Query_9::@Query_9<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Query_9::@Query_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Query_9::@Query_9<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Query_9::@Query_9<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@Query_9::@Query_9<[]>>, !struct.type<@LessThan_3::@LessThan_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2b] : <@Query_9::@Query_9<[]>>, !struct.type<@Num2Bits_8::@Num2Bits_8<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2b$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = struct.readm %arg0[@inComp] : <@Query_9::@Query_9<[]>>, !struct.type<@IN_5::@IN_5<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@inComp$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@gt] : <@Query_9::@Query_9<[]>>, !struct.type<@GreaterThan_4::@GreaterThan_4<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@gt$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@eq] : <@Query_9::@Query_9<[]>>, !struct.type<@IsEqual_1::@IsEqual_1<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@eq$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@mux] : <@Query_9::@Query_9<[]>>, !struct.type<@Mux3_7::@Mux3_7<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@mux$inputs] : <@Query_9::@Query_9<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = array.read %23[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %26[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %6[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c3 step %c1 { + %73 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %arg1[%74] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %76 = pod.read %6[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %78 = array.read %76[%77] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %78, %75 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %29 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = struct.readm %3[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = array.read %30[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %12[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = array.read %32[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = struct.readm %3[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = array.read %34[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = pod.read %12[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = array.read %36[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = struct.readm %3[@out] : <@Num2Bits_8::@Num2Bits_8<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = array.read %38[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = pod.read %12[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = array.read %40[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = array.read %42[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = struct.readm %9[@out] : <@IsEqual_1::@IsEqual_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = array.read %45[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = struct.readm %1[@out] : <@LessThan_3::@LessThan_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = array.read %48[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = struct.readm %7[@out] : <@GreaterThan_4::@GreaterThan_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = array.read %51[%c3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = struct.readm %5[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = array.read %54[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = struct.readm %5[@out] : <@IN_5::@IN_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.sub %felt_const_1, %56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = array.read %58[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = array.read %60[%c6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = array.read %62[%c7] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = struct.readm %11[@out] : <@Mux3_7::@Mux3_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %65 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_1::@IsEqual_1::@constrain(%9, %65) : (!struct.type<@IsEqual_1::@IsEqual_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %66 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_3::@LessThan_3::@constrain(%1, %66) : (!struct.type<@LessThan_3::@LessThan_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %67 = pod.read %12[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = pod.read %12[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux3_7::@Mux3_7::@constrain(%11, %67, %68) : (!struct.type<@Mux3_7::@Mux3_7<[]>>, !array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %69 = pod.read %6[@in] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !felt.type<"babybear"> {product_source = "constrain"} + %70 = pod.read %6[@value] : <[@in: !felt.type<"babybear">, @value: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IN_5::@IN_5::@constrain(%5, %69, %70) : (!struct.type<@IN_5::@IN_5<[]>>, !felt.type<"babybear">, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %71 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_8::@Num2Bits_8::@constrain(%3, %71) : (!struct.type<@Num2Bits_8::@Num2Bits_8<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %72 = pod.read %8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_4::@GreaterThan_4::@constrain(%7, %72) : (!struct.type<@GreaterThan_4::@GreaterThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/quinGeneratePathIndices_test.llzk b/examples/circom-demo/quinGeneratePathIndices_test.llzk new file mode 100644 index 0000000..4620631 --- /dev/null +++ b/examples/circom-demo/quinGeneratePathIndices_test.llzk @@ -0,0 +1,675 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>} { + poly.template @CalculateTotal_0 { + struct.def @CalculateTotal_0 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @sums : !array.type<4 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sums] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c4 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %5 : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %1 : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sums] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_2 { + struct.def @LessThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_1::@Num2Bits_1::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %26 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_2::@LessThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_2::@LessThan_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_2::@LessThan_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_2::@LessThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_2::@LessThan_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_2::@LessThan_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%13, %23) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_2::@LessThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_2::@LessThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_2::@LessThan_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_2::@LessThan_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_2::@LessThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_2::@LessThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_2::@LessThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_2::@LessThan_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_2::@LessThan_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%1, %11) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @QuinGeneratePathIndices_3 { + struct.def @QuinGeneratePathIndices_3 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + struct.member @n : !array.type<5 x !felt.type<"babybear">> + struct.member @leq : !array.type<4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> + struct.member @leq$inputs : !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @sum : !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + struct.member @sum$inputs : !pod.type<[@nums: !array.type<4 x !felt.type<"babybear">>]> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %10 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %10[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %10 : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@nums: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %arg0) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%11] = %arg2 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.umod %arg2, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.uintdiv %arg2, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %14 : !felt.type<"babybear"> + } {product_source = "compute"} + array.write %nondet_0[%c4] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %nondet[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_1[%13] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c0] = %12 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_1[%16] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %17[@in] = %15 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%18] = %17 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%19] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %44 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @LessThan_2::@LessThan_2::@product(%44) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> + %46 = function.call @LessThan_2::@LessThan_2::@compute(%44) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + pod.write %20[@comp] = %45 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + %47 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%47] = %20 : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_1[%24] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %26[%c1] = %felt_const_5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_1[%27] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %28[@in] = %26 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%29] = %28 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array[%30] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %44 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @LessThan_2::@LessThan_2::@compute(%44) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + pod.write %31[@comp] = %45 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46] = %31 : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %35 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %nondet[%35] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.pow %felt_const_5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_2[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@nums] = %39 : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %42 : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %44 = pod.read %pod_2[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @CalculateTotal_0::@CalculateTotal_0::@product(%44) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> + %46 = function.call @CalculateTotal_0::@CalculateTotal_0::@compute(%44) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %45 : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum$inputs] = %pod_2 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !pod.type<[@nums: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + struct.writem %self[@sum] = %1 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + struct.writem %self[@leq$inputs] = %array_1 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %10 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %11 : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@leq] = %array_3 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@n] = %nondet_0 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@n] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@leq] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %self[@leq$inputs] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %6 = struct.readm %self[@sum] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@sum$inputs] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !pod.type<[@nums: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %10 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.sub %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %3[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %3[%14] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %15, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.sub %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.add %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %2[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %5[%13] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %5[%17] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %4[%21] : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "constrain"} + %23 = struct.readm %22[@out] : <@LessThan_2::@LessThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %2[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.pow %felt_const_5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.mul %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %7[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %28[%29] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %6[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %7[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CalculateTotal_0::@CalculateTotal_0::@constrain(%6, %9) : (!struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %10 = array.read %4[%arg1] : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "constrain"} + %11 = array.read %5[%arg1] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_2::@LessThan_2::@constrain(%10, %12) : (!struct.type<@LessThan_2::@LessThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %2 : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@nums: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %arg0) -> (!felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%3] = %arg2 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.umod %arg2, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.uintdiv %arg2, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6 : !felt.type<"babybear"> + } {product_source = "compute"} + array.write %nondet_0[%c4] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_1[%5] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c0] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_1[%8] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%10] = %9 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%11] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %36 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @LessThan_2::@LessThan_2::@compute(%36) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + pod.write %12[@comp] = %37 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%38] = %12 : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_1[%16] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %18[%c1] = %felt_const_5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array_1[%19] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %20[@in] = %18 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%21] = %20 : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array[%22] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %24 = pod.read %23[@count] : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %23[@count] = %25 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %36 = pod.read %20[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @LessThan_2::@LessThan_2::@compute(%36) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + pod.write %23[@comp] = %37 : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + %38 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%38] = %23 : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %27 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %nondet[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.pow %felt_const_5, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.mul %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_2[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %31[%32] = %30 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@nums] = %31 : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %34 : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %36 = pod.read %pod_2[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @CalculateTotal_0::@CalculateTotal_0::@compute(%36) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %37 : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sum$inputs] = %pod_2 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !pod.type<[@nums: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + struct.writem %self[@sum] = %1 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "compute"} + struct.writem %self[@leq$inputs] = %array_1 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@LessThan_2::@LessThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + array.write %array_3[%arg1] = %3 : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@leq] = %array_3 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@n] = %nondet_0 : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c5 = arith.constant 5 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@n] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@leq] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !struct.type<@LessThan_2::@LessThan_2<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@leq$inputs] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !array.type<4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@sum] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@sum$inputs] : <@QuinGeneratePathIndices_3::@QuinGeneratePathIndices_3<[]>>, !pod.type<[@nums: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %8 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.sub %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %1[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %13, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %8 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %3[%11] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %3[%15] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %2[%19] : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@out] : <@LessThan_2::@LessThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%22] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.pow %felt_const_5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.mul %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %5[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %4[@sum] : <@CalculateTotal_0::@CalculateTotal_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %5[@nums] : <[@nums: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CalculateTotal_0::@CalculateTotal_0::@constrain(%4, %7) : (!struct.type<@CalculateTotal_0::@CalculateTotal_0<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %8 = array.read %2[%arg2] : <4 x !struct.type<@LessThan_2::@LessThan_2<[]>>>, !struct.type<@LessThan_2::@LessThan_2<[]>> {product_source = "constrain"} + %9 = array.read %3[%arg2] : <4 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = pod.read %9[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_2::@LessThan_2::@constrain(%8, %10) : (!struct.type<@LessThan_2::@LessThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/quinSelector_test.llzk b/examples/circom-demo/quinSelector_test.llzk new file mode 100644 index 0000000..13116a2 --- /dev/null +++ b/examples/circom-demo/quinSelector_test.llzk @@ -0,0 +1,853 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@QuinSelector_5::@QuinSelector_5<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CalculateTotal_2 { + struct.def @CalculateTotal_2 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @sums : !array.type<5 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@sum] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %self[@sums] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %2[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %7 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %10, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %2[%17] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %2[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %5 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %5 : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %2[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> + } + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %nondet[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%9] = %8 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %1 : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sums] = %nondet : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@sum] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sums] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%7] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %1[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsZero_3 { + struct.def @IsZero_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_3::@IsZero_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_3::@IsZero_3<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_3::@IsZero_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_3::@IsZero_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_3::@IsZero_3<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsEqual_4 { + struct.def @IsEqual_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_3::@IsZero_3<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @IsZero_3::@IsZero_3::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_3::@IsZero_3<[]>> + %20 = function.call @IsZero_3::@IsZero_3::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_4::@IsEqual_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_4::@IsEqual_4<[]>>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@isz] : <@IsEqual_4::@IsEqual_4<[]>>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@isz$inputs] : <@IsEqual_4::@IsEqual_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_3::@IsZero_3::@constrain(%10, %17) : (!struct.type<@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsEqual_4::@IsEqual_4<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @IsZero_3::@IsZero_3::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_4::@IsEqual_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_3::@IsZero_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_4::@IsEqual_4<[]>>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsEqual_4::@IsEqual_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isz] : <@IsEqual_4::@IsEqual_4<[]>>, !struct.type<@IsZero_3::@IsZero_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_4::@IsEqual_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_3::@IsZero_3::@constrain(%1, %8) : (!struct.type<@IsZero_3::@IsZero_3<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @QuinSelector_5 { + struct.def @QuinSelector_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @eqs : !array.type<5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> + struct.member @eqs$inputs : !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @calcTotal : !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> + struct.member @calcTotal$inputs : !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> + struct.member @lessThan : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lessThan$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<5 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@QuinSelector_5::@QuinSelector_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@QuinSelector_5::@QuinSelector_5<[]>> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %27 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %27[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %27 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %pod = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@nums: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %27 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @LessThan_1::@LessThan_1::@product(%27) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %29 = function.call @LessThan_1::@LessThan_1::@compute(%27) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %28 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %4[%c1] = %felt_const_5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %27 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @LessThan_1::@LessThan_1::@compute(%27) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %28 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %27 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_0[%28] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %30[%c0] = %27 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%31] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %32[@in] = %30 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%33] = %32 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%34] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %62 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %63 = function.call @IsEqual_4::@IsEqual_4::@product(%62) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> + %64 = function.call @IsEqual_4::@IsEqual_4::@compute(%62) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + pod.write %35[@comp] = %63 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %65 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%65] = %35 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %39 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_0[%39] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %41 = pod.read %40[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %41[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_0[%42] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %43[@in] = %41 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%44] = %43 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %45 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %array[%45] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %47 = pod.read %46[@count] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %46[@count] = %48 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %62 = pod.read %43[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %63 = function.call @IsEqual_4::@IsEqual_4::@compute(%62) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + pod.write %46[@comp] = %63 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %64 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%64] = %46 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %50 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array[%50] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %53 = struct.readm %52[@out] : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %arg0[%54] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.mul %53, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %pod_1[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %58 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "compute"} + array.write %57[%58] = %56 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@nums] = %57 : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %59 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %60 = arith.subi %59, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %60 : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %61 = arith.cmpi eq, %60, %c0 {product_source = "compute"} : index + scf.if %61 { + %62 = pod.read %pod_1[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %63 = function.call @CalculateTotal_2::@CalculateTotal_2::@product(%62) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> + %64 = function.call @CalculateTotal_2::@CalculateTotal_2::@compute(%62) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %63 : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + %9 = struct.readm %8[@sum] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %9 : <@QuinSelector_5::@QuinSelector_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@calcTotal$inputs] = %pod_1 : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + struct.writem %self[@calcTotal] = %10 : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + struct.writem %self[@eqs$inputs] = %array_0 : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %27 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %28 = pod.read %27[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + array.write %array_4[%arg2] = %28 : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eqs] = %array_4 : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> {product_source = "compute"} + struct.writem %self[@lessThan$inputs] = %pod_3 : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lessThan] = %11 : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@QuinSelector_5::@QuinSelector_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@eqs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> {product_source = "constrain"} + %14 = struct.readm %self[@eqs$inputs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %15 = struct.readm %self[@calcTotal] : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@calcTotal$inputs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %self[@lessThan] : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@lessThan$inputs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %17[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %27 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %14[%28] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %30 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = array.read %30[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %14[%32] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = pod.read %33[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = array.read %34[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %13[%36] : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "constrain"} + %38 = struct.readm %37[@out] : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %arg0[%39] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %38, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = pod.read %16[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %42[%43] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %24 = struct.readm %15[@sum] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %16[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CalculateTotal_2::@CalculateTotal_2::@constrain(%15, %25) : (!struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %27 = array.read %13[%arg2] : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "constrain"} + %28 = array.read %14[%arg2] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_4::@IsEqual_4::@constrain(%27, %29) : (!struct.type<@IsEqual_4::@IsEqual_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %26 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%17, %26) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@QuinSelector_5::@QuinSelector_5<[]>> + } + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@QuinSelector_5::@QuinSelector_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@QuinSelector_5::@QuinSelector_5<[]>> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %12 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %12 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %pod = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@nums: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %12 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @LessThan_1::@LessThan_1::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %13 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %4[%c1] = %felt_const_5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %12 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @LessThan_1::@LessThan_1::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %13 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_0[%13] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c0] = %12 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_0[%16] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %17[@in] = %15 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%18] = %17 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %array[%19] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %47 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @IsEqual_4::@IsEqual_4::@compute(%47) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + pod.write %20[@comp] = %48 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49] = %20 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%24] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %26[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%27] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %28[@in] = %26 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%29] = %28 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array[%30] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %47 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @IsEqual_4::@IsEqual_4::@compute(%47) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + pod.write %31[@comp] = %48 : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %49 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49] = %31 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %35 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %array[%35] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %arg0[%39] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %38, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_1[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %42[%43] = %41 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@nums] = %42 : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %45 : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_1[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @CalculateTotal_2::@CalculateTotal_2::@compute(%47) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %48 : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + %9 = struct.readm %8[@sum] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %9 : <@QuinSelector_5::@QuinSelector_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@calcTotal$inputs] = %pod_1 : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + struct.writem %self[@calcTotal] = %10 : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "compute"} + struct.writem %self[@eqs$inputs] = %array_0 : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_4 = array.new : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %12 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_4::@IsEqual_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + array.write %array_4[%arg2] = %13 : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eqs] = %array_4 : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> {product_source = "compute"} + struct.writem %self[@lessThan$inputs] = %pod_3 : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lessThan] = %11 : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@QuinSelector_5::@QuinSelector_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@QuinSelector_5::@QuinSelector_5<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_5 = felt.const 5 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@QuinSelector_5::@QuinSelector_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@eqs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@eqs$inputs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@calcTotal] : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@calcTotal$inputs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@lessThan] : <@QuinSelector_5::@QuinSelector_5<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@lessThan$inputs] : <@QuinSelector_5::@QuinSelector_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = array.read %9[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %5[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %2[%20] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %1[%24] : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@out] : <@IsEqual_4::@IsEqual_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg1[%27] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %26, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %4[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = struct.readm %3[@sum] : <@CalculateTotal_2::@CalculateTotal_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %4[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CalculateTotal_2::@CalculateTotal_2::@constrain(%3, %13) : (!struct.type<@CalculateTotal_2::@CalculateTotal_2<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %15 = array.read %1[%arg3] : <5 x !struct.type<@IsEqual_4::@IsEqual_4<[]>>>, !struct.type<@IsEqual_4::@IsEqual_4<[]>> {product_source = "constrain"} + %16 = array.read %2[%arg3] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_4::@IsEqual_4::@constrain(%15, %17) : (!struct.type<@IsEqual_4::@IsEqual_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%5, %14) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/rhopi_test.llzk b/examples/circom-demo/rhopi_test.llzk new file mode 100644 index 0000000..263a245 --- /dev/null +++ b/examples/circom-demo/rhopi_test.llzk @@ -0,0 +1,12724 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@RhoPi_74::@RhoPi_74<[]>>} { + poly.template @ShR_0 { + struct.def @ShR_0 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_0::@ShR_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_63 = felt.const 63 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_0::@ShR_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = array.read %arg0[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = array.read %arg0[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_0::@ShR_0<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_0::@ShR_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_63 = felt.const 63 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_0::@ShR_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = array.read %arg0[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_0::@ShR_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_0::@ShR_0<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_63 = felt.const 63 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = array.read %arg1[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_1 { + struct.def @ShL_1 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_1::@ShL_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@ShL_1::@ShL_1<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + array.write %nondet[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_1::@ShL_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_1::@ShL_1<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @OR_2 { + struct.def @OR_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@OR_2::@OR_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_2::@OR_2<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_2::@OR_2<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_2::@OR_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_2::@OR_2<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_2::@OR_2<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OrArray_3 { + struct.def @OrArray_3 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@OR_2::@OR_2<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@OrArray_3::@OrArray_3<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_2::@OR_2::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_2::@OR_2<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_2::@OR_2<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_2::@OR_2::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_2::@OR_2<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_2::@OR_2<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_2::@OR_2<[]>> + %4 = struct.readm %3[@out] : <@OR_2::@OR_2<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@OR_2::@OR_2<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@OR_2::@OR_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_2::@OR_2<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@OR_2::@OR_2<[]>>>, !struct.type<@OR_2::@OR_2<[]>> + } + struct.writem %self[@aux] = %array_1 : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !struct.type<@OR_2::@OR_2<[]>>> + struct.writem %self[@out] = %nondet : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@OrArray_3::@OrArray_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@OrArray_3::@OrArray_3<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !struct.type<@OR_2::@OR_2<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@OR_2::@OR_2<[]>>>, !struct.type<@OR_2::@OR_2<[]>> + %6 = struct.readm %5[@out] : <@OR_2::@OR_2<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@OR_2::@OR_2<[]>>>, !struct.type<@OR_2::@OR_2<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_2::@OR_2::@constrain(%3, %5, %6) : (!struct.type<@OR_2::@OR_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @stepRhoPi_4 { + struct.def @stepRhoPi_4 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_0::@ShR_0<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_1::@ShL_1<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_0::@ShR_0::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_0::@ShR_0<[]>> + %24 = function.call @ShR_0::@ShR_0::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_1::@ShL_1::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %0 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %2 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux0] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux2] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux1] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %7[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %8[@out] : <@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %7[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_0::@ShR_0::@constrain(%4, %10) : (!struct.type<@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_1::@ShL_1::@constrain(%8, %11) : (!struct.type<@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %7[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = pod.read %7[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%6, %12, %13) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_0::@ShR_0::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_1::@ShL_1::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_0::@ShR_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %0 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_1::@ShL_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %2 : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShR_0::@ShR_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !struct.type<@ShL_1::@ShL_1<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %5[@out] : <@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_0::@ShR_0::@constrain(%1, %7) : (!struct.type<@ShR_0::@ShR_0<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_1::@ShL_1::@constrain(%5, %8) : (!struct.type<@ShL_1::@ShL_1<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%3, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_5 { + struct.def @ShR_5 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_5::@ShR_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_5::@ShR_5<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_5::@ShR_5<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_5::@ShR_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_5::@ShR_5<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_5::@ShR_5<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_6 { + struct.def @ShL_6 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_6::@ShL_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %self = struct.new : <@ShL_6::@ShL_6<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_6::@ShL_6<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_6::@ShL_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_6::@ShL_6<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_6::@ShL_6<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_7 { + struct.def @stepRhoPi_7 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_5::@ShR_5<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_6::@ShL_6<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_7::@stepRhoPi_7<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_5::@ShR_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_6::@ShL_6<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_5::@ShR_5<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_5::@ShR_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_5::@ShR_5::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_5::@ShR_5<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_5::@ShR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_5::@ShR_5<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_6::@ShL_6<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_6::@ShL_6<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_6::@ShL_6::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_6::@ShL_6<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_6::@ShL_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_6::@ShL_6<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_5::@ShR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_5::@ShR_5<[]>> + %5 = struct.readm %4[@out] : <@ShR_5::@ShR_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_6::@ShL_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_6::@ShL_6<[]>> + %14 = struct.readm %13[@out] : <@ShL_6::@ShL_6<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_5::@ShR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_5::@ShR_5<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !struct.type<@ShR_5::@ShR_5<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %1 : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_6::@ShL_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_6::@ShL_6<[]>> + struct.writem %self[@aux1] = %2 : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !struct.type<@ShL_6::@ShL_6<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !struct.type<@ShR_5::@ShR_5<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !struct.type<@ShL_6::@ShL_6<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_5::@ShR_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_6::@ShL_6<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_5::@ShR_5::@constrain(%1, %7) : (!struct.type<@ShR_5::@ShR_5<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %8, %9) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_6::@ShL_6::@constrain(%3, %10) : (!struct.type<@ShL_6::@ShL_6<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_8 { + struct.def @ShR_8 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_8::@ShR_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_58 = felt.const 58 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_8::@ShR_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_8::@ShR_8<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_8::@ShR_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_58 = felt.const 58 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_8::@ShR_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_8::@ShR_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_8::@ShR_8<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_58 = felt.const 58 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_58 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_9 { + struct.def @ShL_9 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_9::@ShL_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %self = struct.new : <@ShL_9::@ShL_9<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_6 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_9::@ShL_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_9::@ShL_9<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_6 = felt.const 6 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_6 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_10 { + struct.def @stepRhoPi_10 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_9::@ShL_9<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_8::@ShR_8<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_8::@ShR_8::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_8::@ShR_8<[]>> + %24 = function.call @ShR_8::@ShR_8::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_9::@ShL_9::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %1 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux1] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux0] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux2] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %4[@out] : <@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_9::@ShL_9::@constrain(%4, %10) : (!struct.type<@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%8, %11, %12) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_8::@ShR_8::@constrain(%6, %13) : (!struct.type<@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_8::@ShR_8::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_9::@ShL_9::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_9::@ShL_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %0 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %1 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_8::@ShR_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShL_9::@ShL_9<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@ShR_8::@ShR_8<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %1[@out] : <@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_9::@ShL_9::@constrain(%1, %7) : (!struct.type<@ShL_9::@ShL_9<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%5, %8, %9) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_8::@ShR_8::@constrain(%3, %10) : (!struct.type<@ShR_8::@ShR_8<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_11 { + struct.def @ShR_11 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_11::@ShR_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_11::@ShR_11<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_11::@ShR_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_11::@ShR_11<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_54 = felt.const 54 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_54 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_12 { + struct.def @ShL_12 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_12::@ShL_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %self = struct.new : <@ShL_12::@ShL_12<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_10 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_12::@ShL_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_12::@ShL_12<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_10 = felt.const 10 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_10 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_13 { + struct.def @stepRhoPi_13 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_12::@ShL_12<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_11::@ShR_11<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_13::@stepRhoPi_13<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_11::@ShR_11::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_11::@ShR_11<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_12::@ShL_12::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_12::@ShL_12<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + %5 = struct.readm %4[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + %14 = struct.readm %13[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_12::@ShL_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_12::@ShL_12<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShL_12::@ShL_12<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_11::@ShR_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_11::@ShR_11<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShR_11::@ShR_11<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShL_12::@ShL_12<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@ShR_11::@ShR_11<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_12::@ShL_12::@constrain(%1, %9) : (!struct.type<@ShL_12::@ShL_12<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_11::@ShR_11::@constrain(%3, %10) : (!struct.type<@ShR_11::@ShR_11<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_14 { + struct.def @ShR_14 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_49 = felt.const 49 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_14::@ShR_14<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_14::@ShR_14<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_49 = felt.const 49 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_14::@ShR_14<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_14::@ShR_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_14::@ShR_14<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_49 = felt.const 49 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_15 { + struct.def @ShL_15 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %self = struct.new : <@ShL_15::@ShL_15<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_15) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_15 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_15::@ShL_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_15::@ShL_15<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_15 = felt.const 15 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_15) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_15 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_16 { + struct.def @stepRhoPi_16 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_15::@ShL_15<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_14::@ShR_14<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_14::@ShR_14::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> + %24 = function.call @ShR_14::@ShR_14::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_15::@ShL_15::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux1] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux0] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux2] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %4[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_14::@ShR_14::@constrain(%6, %10) : (!struct.type<@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_15::@ShL_15::@constrain(%4, %11) : (!struct.type<@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%8, %12, %13) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_14::@ShR_14::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_15::@ShL_15::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_14::@ShR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_15::@ShL_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %2 : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShL_15::@ShL_15<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@ShR_14::@ShR_14<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %1[@out] : <@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_14::@ShR_14::@constrain(%3, %7) : (!struct.type<@ShR_14::@ShR_14<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_15::@ShL_15::@constrain(%1, %8) : (!struct.type<@ShL_15::@ShL_15<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_17 { + struct.def @ShR_17 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_17::@ShR_17<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_17::@ShR_17<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_17::@ShR_17<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_17::@ShR_17<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_18 { + struct.def @ShL_18 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_18::@ShL_18<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %self = struct.new : <@ShL_18::@ShL_18<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_21) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_18::@ShL_18<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_18::@ShL_18<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_21) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_19 { + struct.def @stepRhoPi_19 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_17::@ShR_17<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_18::@ShL_18<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_19::@stepRhoPi_19<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_17::@ShR_17::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_17::@ShR_17<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_18::@ShL_18::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_18::@ShL_18<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + %5 = struct.readm %4[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + %14 = struct.readm %13[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_17::@ShR_17<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_17::@ShR_17<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShR_17::@ShR_17<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_18::@ShL_18<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_18::@ShL_18<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShL_18::@ShL_18<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShR_17::@ShR_17<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@ShL_18::@ShL_18<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_17::@ShR_17::@constrain(%1, %7) : (!struct.type<@ShR_17::@ShR_17<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_18::@ShL_18::@constrain(%3, %8) : (!struct.type<@ShL_18::@ShL_18<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_20 { + struct.def @ShR_20 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_36 = felt.const 36 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_20::@ShR_20<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_20::@ShR_20<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_36 = felt.const 36 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_20::@ShR_20<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_20::@ShR_20<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_20::@ShR_20<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_36 = felt.const 36 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_21 { + struct.def @ShL_21 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %self = struct.new : <@ShL_21::@ShL_21<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_28) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_21::@ShL_21<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_21::@ShL_21<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_28) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_22 { + struct.def @stepRhoPi_22 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_21::@ShL_21<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_20::@ShR_20<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_20::@ShR_20::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> + %24 = function.call @ShR_20::@ShR_20::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_21::@ShL_21::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %1 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux2] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux1] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux0] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %6[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_21::@ShL_21::@constrain(%6, %10) : (!struct.type<@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%4, %11, %12) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_20::@ShR_20::@constrain(%8, %13) : (!struct.type<@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_20::@ShR_20::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_21::@ShL_21::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_21::@ShL_21<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %1 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_20::@ShR_20<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShL_21::@ShL_21<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !struct.type<@ShR_20::@ShR_20<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %3[@out] : <@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_21::@ShL_21::@constrain(%3, %7) : (!struct.type<@ShL_21::@ShL_21<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%1, %8, %9) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_20::@ShR_20::@constrain(%5, %10) : (!struct.type<@ShR_20::@ShR_20<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_23 { + struct.def @ShR_23 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_23::@ShR_23<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_23::@ShR_23<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_23::@ShR_23<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_23::@ShR_23<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_28 = felt.const 28 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_28 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_24 { + struct.def @ShL_24 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_24::@ShL_24<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %self = struct.new : <@ShL_24::@ShL_24<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_36) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_24::@ShL_24<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_24::@ShL_24<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_36 = felt.const 36 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_36) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_36 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_25 { + struct.def @stepRhoPi_25 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_23::@ShR_23<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_24::@ShL_24<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_25::@stepRhoPi_25<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_23::@ShR_23::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_23::@ShR_23<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_24::@ShL_24::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_24::@ShL_24<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + %5 = struct.readm %4[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + %14 = struct.readm %13[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_23::@ShR_23<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_23::@ShR_23<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShR_23::@ShR_23<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_24::@ShL_24<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_24::@ShL_24<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShL_24::@ShL_24<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShR_23::@ShR_23<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@ShL_24::@ShL_24<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_23::@ShR_23::@constrain(%1, %7) : (!struct.type<@ShR_23::@ShR_23<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_24::@ShL_24::@constrain(%3, %8) : (!struct.type<@ShL_24::@ShL_24<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_26 { + struct.def @ShR_26 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_19 = felt.const 19 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_26::@ShR_26<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_26::@ShR_26<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_19 = felt.const 19 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_26::@ShR_26<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_26::@ShR_26<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_26::@ShR_26<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_19 = felt.const 19 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_27 { + struct.def @ShL_27 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %self = struct.new : <@ShL_27::@ShL_27<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_45) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_45 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_27::@ShL_27<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_27::@ShL_27<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_45 = felt.const 45 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_45) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_45 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_28 { + struct.def @stepRhoPi_28 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_26::@ShR_26<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_27::@ShL_27<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_26::@ShR_26::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> + %24 = function.call @ShR_26::@ShR_26::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_27::@ShL_27::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux0] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux1] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux2] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %6[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%8, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_26::@ShR_26::@constrain(%4, %12) : (!struct.type<@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_27::@ShL_27::@constrain(%6, %13) : (!struct.type<@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_26::@ShR_26::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_27::@ShL_27::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_26::@ShR_26<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_27::@ShL_27<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShR_26::@ShR_26<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@ShL_27::@ShL_27<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %3[@out] : <@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%5, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_26::@ShR_26::@constrain(%1, %9) : (!struct.type<@ShR_26::@ShR_26<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_27::@ShL_27::@constrain(%3, %10) : (!struct.type<@ShL_27::@ShL_27<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_29 { + struct.def @ShR_29 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_29::@ShR_29<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_29::@ShR_29<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_29::@ShR_29<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_29::@ShR_29<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_9 = felt.const 9 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_9 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_30 { + struct.def @ShL_30 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_30::@ShL_30<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %self = struct.new : <@ShL_30::@ShL_30<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_55) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_55 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_30::@ShL_30<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_30::@ShL_30<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_55 = felt.const 55 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_55) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_55 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_31 { + struct.def @stepRhoPi_31 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_29::@ShR_29<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_30::@ShL_30<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@stepRhoPi_31::@stepRhoPi_31<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_29::@ShR_29::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_29::@ShR_29<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_30::@ShL_30::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_30::@ShL_30<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + %5 = struct.readm %4[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + %14 = struct.readm %13[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_29::@ShR_29<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_29::@ShR_29<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShR_29::@ShR_29<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_30::@ShL_30<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_30::@ShL_30<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShL_30::@ShL_30<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShR_29::@ShR_29<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !struct.type<@ShL_30::@ShL_30<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_29::@ShR_29::@constrain(%3, %7) : (!struct.type<@ShR_29::@ShR_29<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_30::@ShL_30::@constrain(%5, %8) : (!struct.type<@ShL_30::@ShL_30<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%1, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_32 { + struct.def @ShR_32 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_62 = felt.const 62 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_32::@ShR_32<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_32::@ShR_32<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_62 = felt.const 62 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_32::@ShR_32<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_32::@ShR_32<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_32::@ShR_32<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_62 = felt.const 62 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_33 { + struct.def @ShL_33 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@ShL_33::@ShL_33<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_33::@ShL_33<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_33::@ShL_33<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_34 { + struct.def @stepRhoPi_34 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_32::@ShR_32<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_33::@ShL_33<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_32::@ShR_32::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> + %24 = function.call @ShR_32::@ShR_32::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_33::@ShL_33::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux0] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux1] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux2] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %6[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%8, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_32::@ShR_32::@constrain(%4, %12) : (!struct.type<@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_33::@ShL_33::@constrain(%6, %13) : (!struct.type<@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_32::@ShR_32::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_33::@ShL_33::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_32::@ShR_32<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_33::@ShL_33<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShR_32::@ShR_32<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@ShL_33::@ShL_33<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %3[@out] : <@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%5, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_32::@ShR_32::@constrain(%1, %9) : (!struct.type<@ShR_32::@ShR_32<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_33::@ShL_33::@constrain(%3, %10) : (!struct.type<@ShL_33::@ShL_33<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_35 { + struct.def @ShR_35 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_35::@ShR_35<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_35::@ShR_35<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_35::@ShR_35<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_35::@ShR_35<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_50 = felt.const 50 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_50 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_36 { + struct.def @ShL_36 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_36::@ShL_36<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %self = struct.new : <@ShL_36::@ShL_36<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_14) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_14 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_36::@ShL_36<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_36::@ShL_36<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_14 = felt.const 14 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_14) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_14 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_37 { + struct.def @stepRhoPi_37 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_35::@ShR_35<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_36::@ShL_36<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_37::@stepRhoPi_37<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_35::@ShR_35::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_35::@ShR_35<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_36::@ShL_36::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_36::@ShL_36<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + %5 = struct.readm %4[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + %14 = struct.readm %13[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_35::@ShR_35<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_35::@ShR_35<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShR_35::@ShR_35<[]>> + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_36::@ShL_36<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_36::@ShL_36<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShL_36::@ShL_36<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShR_35::@ShR_35<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@ShL_36::@ShL_36<[]>> + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %3[@out] : <@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_35::@ShR_35::@constrain(%1, %7) : (!struct.type<@ShR_35::@ShR_35<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_36::@ShL_36::@constrain(%3, %8) : (!struct.type<@ShL_36::@ShL_36<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_38 { + struct.def @ShR_38 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_38::@ShR_38<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_38::@ShR_38<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_38::@ShR_38<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_38::@ShR_38<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_38::@ShR_38<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_37 = felt.const 37 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_39 { + struct.def @ShL_39 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %self = struct.new : <@ShL_39::@ShL_39<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_27) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_27 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_39::@ShL_39<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_39::@ShL_39<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_27 = felt.const 27 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_27) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_27 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_40 { + struct.def @stepRhoPi_40 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_39::@ShL_39<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_38::@ShR_38<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_38::@ShR_38::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> + %24 = function.call @ShR_38::@ShR_38::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_39::@ShL_39::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux1] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux2] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux0] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %7[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %4[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %7[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %7[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %7[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%6, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_39::@ShL_39::@constrain(%4, %12) : (!struct.type<@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_38::@ShR_38::@constrain(%8, %13) : (!struct.type<@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_38::@ShR_38::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_39::@ShL_39::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_39::@ShL_39<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_38::@ShR_38<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShL_39::@ShL_39<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !struct.type<@ShR_38::@ShR_38<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %1[@out] : <@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%3, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_39::@ShL_39::@constrain(%1, %9) : (!struct.type<@ShL_39::@ShL_39<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_38::@ShR_38::@constrain(%5, %10) : (!struct.type<@ShR_38::@ShR_38<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_41 { + struct.def @ShR_41 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_41::@ShR_41<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_41::@ShR_41<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_41::@ShR_41<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_41::@ShR_41<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_23 = felt.const 23 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_23 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_42 { + struct.def @ShL_42 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_42::@ShL_42<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %self = struct.new : <@ShL_42::@ShL_42<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_41) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_41 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_42::@ShL_42<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_42::@ShL_42<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_41 = felt.const 41 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_41) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_41 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_43 { + struct.def @stepRhoPi_43 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_42::@ShL_42<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_41::@ShR_41<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_43::@stepRhoPi_43<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_41::@ShR_41::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_41::@ShR_41<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_42::@ShL_42::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_42::@ShL_42<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + %5 = struct.readm %4[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + %14 = struct.readm %13[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_42::@ShL_42<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_42::@ShL_42<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShL_42::@ShL_42<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_41::@ShR_41<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_41::@ShR_41<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShR_41::@ShR_41<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShL_42::@ShL_42<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@ShR_41::@ShR_41<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_42::@ShL_42::@constrain(%1, %7) : (!struct.type<@ShL_42::@ShL_42<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_41::@ShR_41::@constrain(%3, %8) : (!struct.type<@ShR_41::@ShR_41<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_44 { + struct.def @ShR_44 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_44::@ShR_44<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_44::@ShR_44<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_44::@ShR_44<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_44::@ShR_44<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_44::@ShR_44<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_45 { + struct.def @ShL_45 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %self = struct.new : <@ShL_45::@ShL_45<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_56) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_45::@ShL_45<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_45::@ShL_45<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_56) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_46 { + struct.def @stepRhoPi_46 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_44::@ShR_44<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_45::@ShL_45<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_44::@ShR_44::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> + %24 = function.call @ShR_44::@ShR_44::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_45::@ShL_45::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %1 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux2] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux0] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux1] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %8[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_45::@ShL_45::@constrain(%8, %10) : (!struct.type<@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%4, %11, %12) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_44::@ShR_44::@constrain(%6, %13) : (!struct.type<@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_44::@ShR_44::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_45::@ShL_45::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_45::@ShL_45<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %1 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_44::@ShR_44<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShR_44::@ShR_44<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !struct.type<@ShL_45::@ShL_45<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %5[@out] : <@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_45::@ShL_45::@constrain(%5, %7) : (!struct.type<@ShL_45::@ShL_45<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%1, %8, %9) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_44::@ShR_44::@constrain(%3, %10) : (!struct.type<@ShR_44::@ShR_44<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_47 { + struct.def @ShR_47 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_47::@ShR_47<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_47::@ShR_47<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_47::@ShR_47<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_47::@ShR_47<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_56 = felt.const 56 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_56 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_48 { + struct.def @ShL_48 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_48::@ShL_48<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %self = struct.new : <@ShL_48::@ShL_48<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_48::@ShL_48<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_48::@ShL_48<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_8 = felt.const 8 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_8) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_49 { + struct.def @stepRhoPi_49 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_48::@ShL_48<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_47::@ShR_47<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_49::@stepRhoPi_49<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_47::@ShR_47::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_47::@ShR_47<[]>> + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_48::@ShL_48::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_48::@ShL_48<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + %5 = struct.readm %4[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + %14 = struct.readm %13[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_48::@ShL_48<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_48::@ShL_48<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShL_48::@ShL_48<[]>> + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_47::@ShR_47<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_47::@ShR_47<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShR_47::@ShR_47<[]>> + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShL_48::@ShL_48<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@ShR_47::@ShR_47<[]>> + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_48::@ShL_48::@constrain(%1, %7) : (!struct.type<@ShL_48::@ShL_48<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_47::@ShR_47::@constrain(%3, %8) : (!struct.type<@ShR_47::@ShR_47<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_50 { + struct.def @ShR_50 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_39 = felt.const 39 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_50::@ShR_50<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_50::@ShR_50<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_39 = felt.const 39 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_50::@ShR_50<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_50::@ShR_50<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_50::@ShR_50<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_39 = felt.const 39 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_51 { + struct.def @ShL_51 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %self = struct.new : <@ShL_51::@ShL_51<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_25) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_51::@ShL_51<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_51::@ShL_51<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_25 = felt.const 25 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_25) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_52 { + struct.def @stepRhoPi_52 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_51::@ShL_51<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_50::@ShR_50<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_50::@ShR_50::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> + %24 = function.call @ShR_50::@ShR_50::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_51::@ShL_51::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux2] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux1] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux0] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %6[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%4, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_50::@ShR_50::@constrain(%8, %12) : (!struct.type<@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_51::@ShL_51::@constrain(%6, %13) : (!struct.type<@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_50::@ShR_50::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_51::@ShL_51::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_50::@ShR_50<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_51::@ShL_51<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShL_51::@ShL_51<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !struct.type<@ShR_50::@ShR_50<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %3[@out] : <@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%1, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_50::@ShR_50::@constrain(%5, %9) : (!struct.type<@ShR_50::@ShR_50<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_51::@ShL_51::@constrain(%3, %10) : (!struct.type<@ShL_51::@ShL_51<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_53 { + struct.def @ShR_53 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_53::@ShR_53<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_53::@ShR_53<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_53::@ShR_53<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_53::@ShR_53<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_21 = felt.const 21 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_21 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_54 { + struct.def @ShL_54 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_54::@ShL_54<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %self = struct.new : <@ShL_54::@ShL_54<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_43) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_54::@ShL_54<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_54::@ShL_54<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_43 = felt.const 43 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_43) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_43 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_55 { + struct.def @stepRhoPi_55 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_54::@ShL_54<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_53::@ShR_53<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_55::@stepRhoPi_55<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_53::@ShR_53::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_53::@ShR_53<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_54::@ShL_54::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_54::@ShL_54<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + %5 = struct.readm %4[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + %14 = struct.readm %13[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_54::@ShL_54<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_54::@ShL_54<[]>> + struct.writem %self[@aux1] = %0 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShL_54::@ShL_54<[]>> + struct.writem %self[@aux0$inputs] = %pod_4 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShR_53::@ShR_53<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_53::@ShR_53<[]>> + struct.writem %self[@aux0] = %1 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShR_53::@ShR_53<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShL_54::@ShL_54<[]>> + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux0] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !struct.type<@ShR_53::@ShR_53<[]>> + %6 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %5[@out] : <@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %1[@out] : <@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_54::@ShL_54::@constrain(%1, %7) : (!struct.type<@ShL_54::@ShL_54<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_53::@ShR_53::@constrain(%5, %8) : (!struct.type<@ShR_53::@ShR_53<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%3, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_56 { + struct.def @ShR_56 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_56::@ShR_56<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_56::@ShR_56<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_56::@ShR_56<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_56::@ShR_56<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_56::@ShR_56<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_57 { + struct.def @ShL_57 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %self = struct.new : <@ShL_57::@ShL_57<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_62) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_57::@ShL_57<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_57::@ShL_57<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_62 = felt.const 62 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_62) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_62 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_58 { + struct.def @stepRhoPi_58 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux1 : !struct.type<@ShL_57::@ShL_57<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_56::@ShR_56<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_56::@ShR_56::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> + %24 = function.call @ShR_56::@ShR_56::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_57::@ShL_57::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux1] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux0] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux2] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %4[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%8, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_57::@ShL_57::@constrain(%4, %12) : (!struct.type<@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_56::@ShR_56::@constrain(%6, %13) : (!struct.type<@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_56::@ShR_56::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_57::@ShL_57::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_0 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShL_57::@ShL_57<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_56::@ShR_56<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux1] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShL_57::@ShL_57<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@ShR_56::@ShR_56<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %1[@out] : <@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%5, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_57::@ShL_57::@constrain(%1, %9) : (!struct.type<@ShL_57::@ShL_57<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_56::@ShR_56::@constrain(%3, %10) : (!struct.type<@ShR_56::@ShR_56<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_59 { + struct.def @ShR_59 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_59::@ShR_59<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_59::@ShR_59<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_59::@ShR_59<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_59::@ShR_59<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_46 = felt.const 46 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_46 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_60 { + struct.def @ShL_60 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_60::@ShL_60<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %self = struct.new : <@ShL_60::@ShL_60<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_18 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_60::@ShL_60<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_60::@ShL_60<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_18 = felt.const 18 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_18 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_61 { + struct.def @stepRhoPi_61 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_59::@ShR_59<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_60::@ShL_60<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_61::@stepRhoPi_61<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_59::@ShR_59::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_59::@ShR_59<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_60::@ShL_60::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_60::@ShL_60<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + %5 = struct.readm %4[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + %14 = struct.readm %13[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %0 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_60::@ShL_60<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_60::@ShL_60<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShL_60::@ShL_60<[]>> + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_59::@ShR_59<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_59::@ShR_59<[]>> + struct.writem %self[@aux0] = %2 : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShR_59::@ShR_59<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShR_59::@ShR_59<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !struct.type<@ShL_60::@ShL_60<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%3, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_60::@ShL_60::@constrain(%5, %9) : (!struct.type<@ShL_60::@ShL_60<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_59::@ShR_59::@constrain(%1, %10) : (!struct.type<@ShR_59::@ShR_59<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_62 { + struct.def @ShR_62 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_62::@ShR_62<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_62::@ShR_62<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_62::@ShR_62<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_62::@ShR_62<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_62::@ShR_62<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_25 = felt.const 25 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_63 { + struct.def @ShL_63 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %self = struct.new : <@ShL_63::@ShL_63<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_39) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_63::@ShL_63<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_63::@ShL_63<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_39 = felt.const 39 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_39) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_39 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_64 { + struct.def @stepRhoPi_64 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_62::@ShR_62<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_63::@ShL_63<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_62::@ShR_62::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> + %24 = function.call @ShR_62::@ShR_62::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_63::@ShL_63::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux0] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux1] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux2] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %6[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %8[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %5[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_62::@ShR_62::@constrain(%4, %10) : (!struct.type<@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %11 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_63::@ShL_63::@constrain(%6, %11) : (!struct.type<@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %9[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = pod.read %9[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%8, %12, %13) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_62::@ShR_62::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_63::@ShL_63::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_62::@ShR_62<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %0 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShL_63::@ShL_63<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_4 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %2 : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShR_62::@ShR_62<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux1] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@ShL_63::@ShL_63<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux2] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %3[@out] : <@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %5[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_62::@ShR_62::@constrain(%1, %7) : (!struct.type<@ShR_62::@ShR_62<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_63::@ShL_63::@constrain(%3, %8) : (!struct.type<@ShL_63::@ShL_63<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%5, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_65 { + struct.def @ShR_65 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_65::@ShR_65<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_65::@ShR_65<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = felt.add %0, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_65::@ShR_65<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_65::@ShR_65<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = felt.add %1, %felt_const_3 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_66 { + struct.def @ShL_66 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_66::@ShL_66<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %self = struct.new : <@ShL_66::@ShL_66<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_61) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_66::@ShL_66<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_66::@ShL_66<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_61 = felt.const 61 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_61) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_61 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_67 { + struct.def @stepRhoPi_67 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux0 : !struct.type<@ShR_65::@ShR_65<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_66::@ShL_66<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@stepRhoPi_67::@stepRhoPi_67<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShR_65::@ShR_65::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_65::@ShR_65<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = function.call @ShL_66::@ShL_66::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_66::@ShL_66<[]>> + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + %5 = struct.readm %4[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_1[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + %14 = struct.readm %13[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %3 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %3 : !felt.type<"babybear"> + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> + pod.write %pod_1[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + } + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux0$inputs] = %pod_0 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ShR_65::@ShR_65<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_65::@ShR_65<[]>> + struct.writem %self[@aux0] = %0 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShR_65::@ShR_65<[]>> + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_66::@ShL_66<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_66::@ShL_66<[]>> + struct.writem %self[@aux1] = %1 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShL_66::@ShL_66<[]>> + struct.writem %self[@aux2$inputs] = %pod_2 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@aux2] = %2 : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.writem %self[@out] = %nondet : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux0] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShR_65::@ShR_65<[]>> + %2 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux2] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> + %4 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !struct.type<@ShL_66::@ShL_66<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %1[@out] : <@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %11 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = struct.readm %5[@out] : <@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %11 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %11 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %12 = struct.readm %3[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %13 = cast.toindex %11 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %11 : !felt.type<"babybear"> + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_65::@ShR_65::@constrain(%1, %7) : (!struct.type<@ShR_65::@ShR_65<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %8 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_66::@ShL_66::@constrain(%5, %8) : (!struct.type<@ShL_66::@ShL_66<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_3::@OrArray_3::@constrain(%3, %9, %10) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_68 { + struct.def @ShR_68 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_44 = felt.const 44 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_68::@ShR_68<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_68::@ShR_68<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_44 = felt.const 44 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_68::@ShR_68<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_68::@ShR_68<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_68::@ShR_68<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_44 = felt.const 44 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_69 { + struct.def @ShL_69 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %self = struct.new : <@ShL_69::@ShL_69<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_20) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_69::@ShL_69<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_69::@ShL_69<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_20 = felt.const 20 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_20) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_70 { + struct.def @stepRhoPi_70 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_68::@ShR_68<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_69::@ShL_69<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_68::@ShR_68::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> + %24 = function.call @ShR_68::@ShR_68::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_69::@ShL_69::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux2] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux0] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux1] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %8[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%4, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_68::@ShR_68::@constrain(%6, %12) : (!struct.type<@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_69::@ShL_69::@constrain(%8, %13) : (!struct.type<@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_68::@ShR_68::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_69::@ShL_69::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_68::@ShR_68<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %1 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_69::@ShL_69<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %2 : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShR_68::@ShR_68<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !struct.type<@ShL_69::@ShL_69<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %5[@out] : <@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%1, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_68::@ShR_68::@constrain(%3, %9) : (!struct.type<@ShR_68::@ShR_68<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_69::@ShL_69::@constrain(%5, %10) : (!struct.type<@ShL_69::@ShL_69<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShR_71 { + struct.def @ShR_71 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_20 = felt.const 20 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_71::@ShR_71<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %3 { + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %7 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10] = %9 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %4 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %4, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = bool.cmp ge(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %6 { + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %7 = felt.add %4, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@ShR_71::@ShR_71<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_20 = felt.const 20 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@ShR_71::@ShR_71<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %3 = felt.add %0, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@ShR_71::@ShR_71<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_71::@ShR_71<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_20 = felt.const 20 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %4 = felt.add %1, %felt_const_20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @ShL_72 { + struct.def @ShL_72 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %self = struct.new : <@ShL_72::@ShL_72<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_44) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_72::@ShL_72<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_72::@ShL_72<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_44 = felt.const 44 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_44) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %4, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_44 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @stepRhoPi_73 { + struct.def @stepRhoPi_73 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_3::@OrArray_3<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_71::@ShR_71<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_72::@ShL_72<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShR_71::@ShR_71::@product(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> + %24 = function.call @ShR_71::@ShR_71::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @ShL_72::@ShL_72::@compute(%22) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %19 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @OrArray_3::@OrArray_3::@compute(%33, %34) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@aux2] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@aux2$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@aux0] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@aux0$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %self[@aux1] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "constrain"} + %9 = struct.readm %self[@aux1$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %8[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = pod.read %5[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %5[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%4, %10, %11) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %9[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_72::@ShL_72::@constrain(%8, %12) : (!struct.type<@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %7[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_71::@ShR_71::@constrain(%6, %13) : (!struct.type<@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShR_71::@ShR_71::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %6 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %9 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @ShL_72::@ShL_72::@compute(%11) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %12 : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %13 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %17 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %24 = function.call @OrArray_3::@OrArray_3::@compute(%22, %23) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %24 : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@aux2$inputs] = %pod_0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_3::@OrArray_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux2] = %0 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "compute"} + struct.writem %self[@aux1$inputs] = %pod_4 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_72::@ShL_72<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + struct.writem %self[@aux1] = %1 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "compute"} + struct.writem %self[@aux0$inputs] = %pod_2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@ShR_71::@ShR_71<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + struct.writem %self[@aux0] = %2 : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + } + function.def @constrain(%arg0: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@aux2] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@OrArray_3::@OrArray_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@aux2$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@aux0] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShR_71::@ShR_71<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@aux0$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@aux1] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !struct.type<@ShL_72::@ShL_72<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@aux1$inputs] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %3[@out] : <@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %5[@out] : <@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %1[@out] : <@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @OrArray_3::@OrArray_3::@constrain(%1, %7, %8) : (!struct.type<@OrArray_3::@OrArray_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShL_72::@ShL_72::@constrain(%5, %9) : (!struct.type<@ShL_72::@ShL_72<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @ShR_71::@ShR_71::@constrain(%3, %10) : (!struct.type<@ShR_71::@ShR_71<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @RhoPi_74 { + struct.def @RhoPi_74 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @s8 : !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + struct.member @s8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s24 : !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + struct.member @s24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s3 : !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> + struct.member @s3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s23 : !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> + struct.member @s23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s14 : !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> + struct.member @s14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s12 : !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + struct.member @s12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s18 : !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + struct.member @s18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s2 : !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> + struct.member @s2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s7 : !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> + struct.member @s7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s5 : !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + struct.member @s5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s17 : !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> + struct.member @s17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s9 : !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> + struct.member @s9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s10 : !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> + struct.member @s10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s21 : !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> + struct.member @s21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s11 : !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + struct.member @s11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s15 : !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + struct.member @s15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s20 : !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + struct.member @s20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s6 : !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + struct.member @s6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s1 : !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + struct.member @s1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s16 : !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> + struct.member @s16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s4 : !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> + struct.member @s4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s13 : !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> + struct.member @s13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s22 : !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + struct.member @s22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + struct.member @s19 : !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + struct.member @s19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_74::@RhoPi_74<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@RhoPi_74::@RhoPi_74<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_4::@stepRhoPi_4::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> + %108 = function.call @stepRhoPi_4::@stepRhoPi_4::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_7::@stepRhoPi_7::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_10::@stepRhoPi_10::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> + %108 = function.call @stepRhoPi_10::@stepRhoPi_10::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_13::@stepRhoPi_13::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_16::@stepRhoPi_16::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> + %108 = function.call @stepRhoPi_16::@stepRhoPi_16::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_19::@stepRhoPi_19::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_22::@stepRhoPi_22::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> + %108 = function.call @stepRhoPi_22::@stepRhoPi_22::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_25::@stepRhoPi_25::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_28::@stepRhoPi_28::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> + %108 = function.call @stepRhoPi_28::@stepRhoPi_28::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_31::@stepRhoPi_31::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_34::@stepRhoPi_34::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> + %108 = function.call @stepRhoPi_34::@stepRhoPi_34::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_37::@stepRhoPi_37::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_40::@stepRhoPi_40::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> + %108 = function.call @stepRhoPi_40::@stepRhoPi_40::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_43::@stepRhoPi_43::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_46::@stepRhoPi_46::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> + %108 = function.call @stepRhoPi_46::@stepRhoPi_46::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_49::@stepRhoPi_49::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_52::@stepRhoPi_52::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> + %108 = function.call @stepRhoPi_52::@stepRhoPi_52::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_55::@stepRhoPi_55::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_58::@stepRhoPi_58::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> + %108 = function.call @stepRhoPi_58::@stepRhoPi_58::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_61::@stepRhoPi_61::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_64::@stepRhoPi_64::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> + %108 = function.call @stepRhoPi_64::@stepRhoPi_64::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_67::@stepRhoPi_67::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_70::@stepRhoPi_70::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> + %108 = function.call @stepRhoPi_70::@stepRhoPi_70::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %97, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %101[%102] = %100 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %101 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %104 = arith.subi %103, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %104 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %105 = arith.cmpi eq, %104, %c0 {product_source = "compute"} : index + scf.if %105 { + %106 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %107 = function.call @stepRhoPi_73::@stepRhoPi_73::@product(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> + %108 = function.call @stepRhoPi_73::@stepRhoPi_73::@compute(%106) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %107 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %99 = array.read %arg0[%98] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%100] = %99 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %101 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + %102 = struct.readm %101[@out] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %103 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %104 = array.read %102[%103] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %105 = felt.add %97, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%106] = %104 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %107 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + %108 = struct.readm %107[@out] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %109 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %110 = array.read %108[%109] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %111 = felt.add %97, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%112] = %110 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %113 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + %114 = struct.readm %113[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %115 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %116 = array.read %114[%115] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %117 = felt.add %97, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %118 = cast.toindex %117 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%118] = %116 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %119 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + %120 = struct.readm %119[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %121 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %122 = array.read %120[%121] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %123 = felt.add %97, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %124 = cast.toindex %123 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%124] = %122 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %125 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + %126 = struct.readm %125[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %127 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %128 = array.read %126[%127] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %129 = felt.add %97, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%130] = %128 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %131 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + %132 = struct.readm %131[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %133 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %135 = felt.add %97, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %136 = cast.toindex %135 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%136] = %134 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %137 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + %138 = struct.readm %137[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %139 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %141 = felt.add %97, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %142 = cast.toindex %141 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%142] = %140 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %143 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + %144 = struct.readm %143[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %145 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %147 = felt.add %97, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %148 = cast.toindex %147 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%148] = %146 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %149 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + %150 = struct.readm %149[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %151 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %153 = felt.add %97, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %154 = cast.toindex %153 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%154] = %152 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %155 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + %156 = struct.readm %155[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %157 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %159 = felt.add %97, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%160] = %158 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %161 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + %162 = struct.readm %161[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %163 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %165 = felt.add %97, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %166 = cast.toindex %165 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%166] = %164 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %167 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + %168 = struct.readm %167[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %169 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %171 = felt.add %97, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %172 = cast.toindex %171 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%172] = %170 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %173 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + %174 = struct.readm %173[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %175 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %177 = felt.add %97, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %178 = cast.toindex %177 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%178] = %176 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %179 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + %180 = struct.readm %179[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %181 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %183 = felt.add %97, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %184 = cast.toindex %183 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%184] = %182 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %185 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + %186 = struct.readm %185[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %187 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %189 = felt.add %97, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %190 = cast.toindex %189 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%190] = %188 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %191 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + %192 = struct.readm %191[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %193 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = felt.add %97, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%196] = %194 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %197 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + %198 = struct.readm %197[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %199 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %201 = felt.add %97, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %202 = cast.toindex %201 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%202] = %200 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + %204 = struct.readm %203[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %207 = felt.add %97, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%208] = %206 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %209 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + %210 = struct.readm %209[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %213 = felt.add %97, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %214 = cast.toindex %213 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%214] = %212 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %215 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + %216 = struct.readm %215[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %217 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = felt.add %97, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %220 = cast.toindex %219 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%220] = %218 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %221 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + %222 = struct.readm %221[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %223 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %224 = array.read %222[%223] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %225 = felt.add %97, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %226 = cast.toindex %225 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%226] = %224 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + %228 = struct.readm %227[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %230 = array.read %228[%229] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %231 = felt.add %97, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %232 = cast.toindex %231 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%232] = %230 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %233 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + %234 = struct.readm %233[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %236 = array.read %234[%235] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %237 = felt.add %97, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %238 = cast.toindex %237 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%238] = %236 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %239 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + %240 = struct.readm %239[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %241 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "compute"} + %242 = array.read %240[%241] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %243 = felt.add %97, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %244 = cast.toindex %243 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%244] = %242 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@s23$inputs] = %pod_6 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + struct.writem %self[@s23] = %0 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + struct.writem %self[@s6$inputs] = %pod_34 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + struct.writem %self[@s6] = %1 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + struct.writem %self[@s16$inputs] = %pod_38 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + struct.writem %self[@s16] = %2 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + struct.writem %self[@s12$inputs] = %pod_10 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + struct.writem %self[@s12] = %3 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + struct.writem %self[@s17$inputs] = %pod_20 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + struct.writem %self[@s17] = %4 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + struct.writem %self[@s18$inputs] = %pod_12 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + struct.writem %self[@s18] = %5 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + struct.writem %self[@s10$inputs] = %pod_24 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + struct.writem %self[@s10] = %6 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + struct.writem %self[@s11$inputs] = %pod_28 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + struct.writem %self[@s11] = %7 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + struct.writem %self[@s22$inputs] = %pod_44 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + struct.writem %self[@s22] = %8 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + struct.writem %self[@s19$inputs] = %pod_46 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + struct.writem %self[@s19] = %9 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + struct.writem %self[@s5$inputs] = %pod_18 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + struct.writem %self[@s5] = %10 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + struct.writem %self[@s1$inputs] = %pod_36 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + struct.writem %self[@s1] = %11 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + struct.writem %self[@s7$inputs] = %pod_16 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + struct.writem %self[@s7] = %12 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + struct.writem %self[@s13$inputs] = %pod_42 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + struct.writem %self[@s13] = %13 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + struct.writem %self[@s24$inputs] = %pod_2 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + struct.writem %self[@s24] = %14 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + struct.writem %self[@s4$inputs] = %pod_40 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + struct.writem %self[@s4] = %15 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + struct.writem %self[@s3$inputs] = %pod_4 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + struct.writem %self[@s3] = %16 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + struct.writem %self[@s14$inputs] = %pod_8 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + struct.writem %self[@s14] = %17 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + struct.writem %self[@s8$inputs] = %pod_0 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + struct.writem %self[@s8] = %18 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + struct.writem %self[@s15$inputs] = %pod_30 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + struct.writem %self[@s15] = %19 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + struct.writem %self[@s9$inputs] = %pod_22 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + struct.writem %self[@s9] = %20 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + struct.writem %self[@s20$inputs] = %pod_32 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + struct.writem %self[@s20] = %21 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + struct.writem %self[@s2$inputs] = %pod_14 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + struct.writem %self[@s2] = %22 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + struct.writem %self[@s21$inputs] = %pod_26 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + struct.writem %self[@s21] = %23 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@RhoPi_74::@RhoPi_74<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %24 = struct.readm %self[@out] : <@RhoPi_74::@RhoPi_74<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = struct.readm %self[@s8] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "constrain"} + %26 = struct.readm %self[@s8$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %self[@s24] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "constrain"} + %28 = struct.readm %self[@s24$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %self[@s3] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "constrain"} + %30 = struct.readm %self[@s3$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %self[@s23] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "constrain"} + %32 = struct.readm %self[@s23$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %self[@s14] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "constrain"} + %34 = struct.readm %self[@s14$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %self[@s12] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "constrain"} + %36 = struct.readm %self[@s12$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %self[@s18] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "constrain"} + %38 = struct.readm %self[@s18$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %self[@s2] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "constrain"} + %40 = struct.readm %self[@s2$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %self[@s7] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "constrain"} + %42 = struct.readm %self[@s7$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %self[@s5] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "constrain"} + %44 = struct.readm %self[@s5$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %self[@s17] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "constrain"} + %46 = struct.readm %self[@s17$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %self[@s9] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "constrain"} + %48 = struct.readm %self[@s9$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %self[@s10] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "constrain"} + %50 = struct.readm %self[@s10$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = struct.readm %self[@s21] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "constrain"} + %52 = struct.readm %self[@s21$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %53 = struct.readm %self[@s11] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "constrain"} + %54 = struct.readm %self[@s11$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = struct.readm %self[@s15] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "constrain"} + %56 = struct.readm %self[@s15$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %57 = struct.readm %self[@s20] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "constrain"} + %58 = struct.readm %self[@s20$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %59 = struct.readm %self[@s6] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "constrain"} + %60 = struct.readm %self[@s6$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %61 = struct.readm %self[@s1] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "constrain"} + %62 = struct.readm %self[@s1$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %63 = struct.readm %self[@s16] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "constrain"} + %64 = struct.readm %self[@s16$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %65 = struct.readm %self[@s4] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "constrain"} + %66 = struct.readm %self[@s4$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %67 = struct.readm %self[@s13] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "constrain"} + %68 = struct.readm %self[@s13$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %69 = struct.readm %self[@s22] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "constrain"} + %70 = struct.readm %self[@s22$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %71 = struct.readm %self[@s19] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "constrain"} + %72 = struct.readm %self[@s19$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %72[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = felt.add %97, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "constrain"} + %100 = array.read %arg0[%99] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %101 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %103, %100 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %97 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %98 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %99 = array.read %arg0[%98] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %100 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %101 = array.read %24[%100] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %101, %99 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %102 = struct.readm %49[@out] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %103 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %104 = array.read %102[%103] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %105 = felt.add %97, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "constrain"} + %107 = array.read %24[%106] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %107, %104 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %108 = struct.readm %41[@out] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %110 = array.read %108[%109] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %111 = felt.add %97, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "constrain"} + %113 = array.read %24[%112] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %113, %110 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %114 = struct.readm %53[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %116 = array.read %114[%115] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %117 = felt.add %97, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %118 = cast.toindex %117 : !felt.type<"babybear"> {product_source = "constrain"} + %119 = array.read %24[%118] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %119, %116 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %120 = struct.readm %45[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %122 = array.read %120[%121] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %123 = felt.add %97, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %124 = cast.toindex %123 : !felt.type<"babybear"> {product_source = "constrain"} + %125 = array.read %24[%124] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %125, %122 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %126 = struct.readm %37[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %128 = array.read %126[%127] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %129 = felt.add %97, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %24[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = struct.readm %29[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = felt.add %97, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %136 = cast.toindex %135 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %24[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = struct.readm %43[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = felt.add %97, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %142 = cast.toindex %141 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %24[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %144 = struct.readm %63[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %147 = felt.add %97, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %148 = cast.toindex %147 : !felt.type<"babybear"> {product_source = "constrain"} + %149 = array.read %24[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %150 = struct.readm %25[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %153 = felt.add %97, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %154 = cast.toindex %153 : !felt.type<"babybear"> {product_source = "constrain"} + %155 = array.read %24[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %156 = struct.readm %51[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = felt.add %97, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %24[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %27[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = felt.add %97, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %166 = cast.toindex %165 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %24[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = struct.readm %65[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = felt.add %97, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %172 = cast.toindex %171 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %24[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = struct.readm %55[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = felt.add %97, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %178 = cast.toindex %177 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %24[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = struct.readm %31[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %181 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = felt.add %97, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %184 = cast.toindex %183 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %24[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %186 = struct.readm %71[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %187 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %189 = felt.add %97, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %190 = cast.toindex %189 : !felt.type<"babybear"> {product_source = "constrain"} + %191 = array.read %24[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %67[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %97, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %24[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %35[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = felt.add %97, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %202 = cast.toindex %201 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %24[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = struct.readm %39[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %205 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = felt.add %97, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %24[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = struct.readm %57[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %211 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = felt.add %97, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %214 = cast.toindex %213 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %24[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = struct.readm %33[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %217 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = felt.add %97, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %220 = cast.toindex %219 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %24[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %222 = struct.readm %69[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %223 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %224 = array.read %222[%223] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %225 = felt.add %97, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %226 = cast.toindex %225 : !felt.type<"babybear"> {product_source = "constrain"} + %227 = array.read %24[%226] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %227, %224 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %228 = struct.readm %47[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %229 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %230 = array.read %228[%229] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %231 = felt.add %97, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %232 = cast.toindex %231 : !felt.type<"babybear"> {product_source = "constrain"} + %233 = array.read %24[%232] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %233, %230 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %234 = struct.readm %59[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %235 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %236 = array.read %234[%235] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %237 = felt.add %97, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %238 = cast.toindex %237 : !felt.type<"babybear"> {product_source = "constrain"} + %239 = array.read %24[%238] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %239, %236 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %240 = struct.readm %61[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %241 = cast.toindex %97 : !felt.type<"babybear"> {product_source = "constrain"} + %242 = array.read %240[%241] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %243 = felt.add %97, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %244 = cast.toindex %243 : !felt.type<"babybear"> {product_source = "constrain"} + %245 = array.read %24[%244] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %245, %242 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %73 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_43::@stepRhoPi_43::@constrain(%31, %73) : (!struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %74 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_70::@stepRhoPi_70::@constrain(%59, %74) : (!struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_25::@stepRhoPi_25::@constrain(%63, %75) : (!struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %76 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_52::@stepRhoPi_52::@constrain(%35, %76) : (!struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %77 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_13::@stepRhoPi_13::@constrain(%45, %77) : (!struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %78 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_16::@stepRhoPi_16::@constrain(%37, %78) : (!struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %79 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_4::@stepRhoPi_4::@constrain(%49, %79) : (!struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %80 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_10::@stepRhoPi_10::@constrain(%53, %80) : (!struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %81 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_64::@stepRhoPi_64::@constrain(%69, %81) : (!struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %82 = pod.read %72[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_46::@stepRhoPi_46::@constrain(%71, %82) : (!struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %83 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_22::@stepRhoPi_22::@constrain(%43, %83) : (!struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %84 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_73::@stepRhoPi_73::@constrain(%61, %84) : (!struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %85 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_7::@stepRhoPi_7::@constrain(%41, %85) : (!struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %86 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_49::@stepRhoPi_49::@constrain(%67, %86) : (!struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %87 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_34::@stepRhoPi_34::@constrain(%27, %87) : (!struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %88 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_37::@stepRhoPi_37::@constrain(%65, %88) : (!struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %89 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_19::@stepRhoPi_19::@constrain(%29, %89) : (!struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %90 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_61::@stepRhoPi_61::@constrain(%33, %90) : (!struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %91 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_28::@stepRhoPi_28::@constrain(%25, %91) : (!struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %92 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_40::@stepRhoPi_40::@constrain(%55, %92) : (!struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_67::@stepRhoPi_67::@constrain(%47, %93) : (!struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %94 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_58::@stepRhoPi_58::@constrain(%57, %94) : (!struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %95 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_55::@stepRhoPi_55::@constrain(%39, %95) : (!struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %96 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_31::@stepRhoPi_31::@constrain(%51, %96) : (!struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@RhoPi_74::@RhoPi_74<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@RhoPi_74::@RhoPi_74<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@RhoPi_74::@RhoPi_74<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_4::@stepRhoPi_4::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_7::@stepRhoPi_7::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_10::@stepRhoPi_10::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_13::@stepRhoPi_13::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_16::@stepRhoPi_16::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_19::@stepRhoPi_19::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_22::@stepRhoPi_22::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_25::@stepRhoPi_25::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_28::@stepRhoPi_28::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_31::@stepRhoPi_31::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_34::@stepRhoPi_34::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_37::@stepRhoPi_37::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_40::@stepRhoPi_40::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_43::@stepRhoPi_43::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_46::@stepRhoPi_46::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_49::@stepRhoPi_49::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_52::@stepRhoPi_52::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_55::@stepRhoPi_55::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_58::@stepRhoPi_58::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_61::@stepRhoPi_61::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_64::@stepRhoPi_64::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_67::@stepRhoPi_67::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_70::@stepRhoPi_70::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %24, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg0[%26] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %28 : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %31 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @stepRhoPi_73::@stepRhoPi_73::@compute(%33) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %34 : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %24 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg0[%25] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%27] = %26 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + %29 = struct.readm %28[@out] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %30 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %29[%30] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = felt.add %24, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%33] = %31 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + %35 = struct.readm %34[@out] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %35[%36] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %24, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %37 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + %41 = struct.readm %40[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %41[%42] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.add %24, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%45] = %43 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + %47 = struct.readm %46[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %47[%48] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %24, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %49 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + %53 = struct.readm %52[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %53[%54] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.add %24, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%57] = %55 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + %59 = struct.readm %58[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %60 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %59[%60] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = felt.add %24, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%63] = %61 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + %65 = struct.readm %64[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %65[%66] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %68 = felt.add %24, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%69] = %67 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %70 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + %71 = struct.readm %70[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %71[%72] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %74 = felt.add %24, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%75] = %73 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %76 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + %77 = struct.readm %76[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %80 = felt.add %24, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %80 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%81] = %79 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + %83 = struct.readm %82[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %84 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %83[%84] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %86 = felt.add %24, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %86 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%87] = %85 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %88 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + %89 = struct.readm %88[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %89[%90] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = felt.add %24, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %93 = cast.toindex %92 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%93] = %91 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %94 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + %95 = struct.readm %94[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %96 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %97 = array.read %95[%96] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %98 = felt.add %24, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %99 = cast.toindex %98 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%99] = %97 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + %101 = struct.readm %100[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %103 = array.read %101[%102] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %104 = felt.add %24, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %105 = cast.toindex %104 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%105] = %103 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %106 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + %107 = struct.readm %106[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %108 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %109 = array.read %107[%108] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %110 = felt.add %24, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %111 = cast.toindex %110 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%111] = %109 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %112 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + %113 = struct.readm %112[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %114 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %115 = array.read %113[%114] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %116 = felt.add %24, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %116 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%117] = %115 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %118 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + %119 = struct.readm %118[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %120 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %121 = array.read %119[%120] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %122 = felt.add %24, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %122 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%123] = %121 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %124 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + %125 = struct.readm %124[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %126 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %127 = array.read %125[%126] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %128 = felt.add %24, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %129 = cast.toindex %128 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%129] = %127 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %130 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + %131 = struct.readm %130[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %132 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %133 = array.read %131[%132] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %134 = felt.add %24, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %135 = cast.toindex %134 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%135] = %133 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %136 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + %137 = struct.readm %136[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %138 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %139 = array.read %137[%138] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %140 = felt.add %24, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %141 = cast.toindex %140 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%141] = %139 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %142 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + %143 = struct.readm %142[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %144 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %145 = array.read %143[%144] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %146 = felt.add %24, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %147 = cast.toindex %146 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%147] = %145 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %148 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + %149 = struct.readm %148[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %150 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %151 = array.read %149[%150] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %152 = felt.add %24, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %153 = cast.toindex %152 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%153] = %151 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %154 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + %155 = struct.readm %154[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %156 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %157 = array.read %155[%156] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %158 = felt.add %24, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %159 = cast.toindex %158 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%159] = %157 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %160 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + %161 = struct.readm %160[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %162 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %163 = array.read %161[%162] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %164 = felt.add %24, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %165 = cast.toindex %164 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%165] = %163 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %166 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + %167 = struct.readm %166[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %168 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "compute"} + %169 = array.read %167[%168] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %170 = felt.add %24, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %171 = cast.toindex %170 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%171] = %169 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@s23$inputs] = %pod_6 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + struct.writem %self[@s23] = %0 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "compute"} + struct.writem %self[@s6$inputs] = %pod_34 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + struct.writem %self[@s6] = %1 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "compute"} + struct.writem %self[@s16$inputs] = %pod_38 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + struct.writem %self[@s16] = %2 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "compute"} + struct.writem %self[@s12$inputs] = %pod_10 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + struct.writem %self[@s12] = %3 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "compute"} + struct.writem %self[@s17$inputs] = %pod_20 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + struct.writem %self[@s17] = %4 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "compute"} + struct.writem %self[@s18$inputs] = %pod_12 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + struct.writem %self[@s18] = %5 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "compute"} + struct.writem %self[@s10$inputs] = %pod_24 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + struct.writem %self[@s10] = %6 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "compute"} + struct.writem %self[@s11$inputs] = %pod_28 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + struct.writem %self[@s11] = %7 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "compute"} + struct.writem %self[@s22$inputs] = %pod_44 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + struct.writem %self[@s22] = %8 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "compute"} + struct.writem %self[@s19$inputs] = %pod_46 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + struct.writem %self[@s19] = %9 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "compute"} + struct.writem %self[@s5$inputs] = %pod_18 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + struct.writem %self[@s5] = %10 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "compute"} + struct.writem %self[@s1$inputs] = %pod_36 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + struct.writem %self[@s1] = %11 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "compute"} + struct.writem %self[@s7$inputs] = %pod_16 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + struct.writem %self[@s7] = %12 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "compute"} + struct.writem %self[@s13$inputs] = %pod_42 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + struct.writem %self[@s13] = %13 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "compute"} + struct.writem %self[@s24$inputs] = %pod_2 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + struct.writem %self[@s24] = %14 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "compute"} + struct.writem %self[@s4$inputs] = %pod_40 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + struct.writem %self[@s4] = %15 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "compute"} + struct.writem %self[@s3$inputs] = %pod_4 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + struct.writem %self[@s3] = %16 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "compute"} + struct.writem %self[@s14$inputs] = %pod_8 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + struct.writem %self[@s14] = %17 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "compute"} + struct.writem %self[@s8$inputs] = %pod_0 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + struct.writem %self[@s8] = %18 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "compute"} + struct.writem %self[@s15$inputs] = %pod_30 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + struct.writem %self[@s15] = %19 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "compute"} + struct.writem %self[@s9$inputs] = %pod_22 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + struct.writem %self[@s9] = %20 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "compute"} + struct.writem %self[@s20$inputs] = %pod_32 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + struct.writem %self[@s20] = %21 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "compute"} + struct.writem %self[@s2$inputs] = %pod_14 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + struct.writem %self[@s2] = %22 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "compute"} + struct.writem %self[@s21$inputs] = %pod_26 : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, @params: !pod.type<[]>]>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + struct.writem %self[@s21] = %23 : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@RhoPi_74::@RhoPi_74<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@RhoPi_74::@RhoPi_74<[]>> + } + function.def @constrain(%arg0: !struct.type<@RhoPi_74::@RhoPi_74<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@RhoPi_74::@RhoPi_74<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@s8] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@s8$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@s24] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@s24$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@s3] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@s3$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@s23] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@s23$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@s14] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@s14$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@s12] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@s12$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@s18] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@s18$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@s2] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@s2$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@s7] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@s7$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@s5] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@s5$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@s17] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@s17$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@s9] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@s9$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@s10] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@s10$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@s21] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@s21$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@s11] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@s11$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@s15] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@s15$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@s20] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@s20$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@s6] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@s6$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@s1] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@s1$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@s16] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@s16$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@s4] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@s4$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@s13] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@s13$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@s22] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@s22$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@s19] : <@RhoPi_74::@RhoPi_74<[]>>, !struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@s19$inputs] : <@RhoPi_74::@RhoPi_74<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = felt.add %73, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "constrain"} + %76 = array.read %arg1[%75] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %77 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %79 = array.read %77[%78] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %79, %76 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %73 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %74 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %75 = array.read %arg1[%74] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %76 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %77 = array.read %0[%76] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %77, %75 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %78 = struct.readm %25[@out] : <@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %79 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %80 = array.read %78[%79] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = felt.add %73, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %82 = cast.toindex %81 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = array.read %0[%82] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %84 = struct.readm %17[@out] : <@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %85 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %86 = array.read %84[%85] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %87 = felt.add %73, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %88 = cast.toindex %87 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %0[%88] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %90 = struct.readm %29[@out] : <@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %91 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %92 = array.read %90[%91] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %93 = felt.add %73, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %94 = cast.toindex %93 : !felt.type<"babybear"> {product_source = "constrain"} + %95 = array.read %0[%94] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %95, %92 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %96 = struct.readm %21[@out] : <@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %97 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %98 = array.read %96[%97] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %99 = felt.add %73, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %100 = cast.toindex %99 : !felt.type<"babybear"> {product_source = "constrain"} + %101 = array.read %0[%100] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %101, %98 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %102 = struct.readm %13[@out] : <@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %103 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %104 = array.read %102[%103] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %105 = felt.add %73, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %106 = cast.toindex %105 : !felt.type<"babybear"> {product_source = "constrain"} + %107 = array.read %0[%106] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %107, %104 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %108 = struct.readm %5[@out] : <@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %110 = array.read %108[%109] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %111 = felt.add %73, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %112 = cast.toindex %111 : !felt.type<"babybear"> {product_source = "constrain"} + %113 = array.read %0[%112] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %113, %110 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %114 = struct.readm %19[@out] : <@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %116 = array.read %114[%115] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %117 = felt.add %73, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %118 = cast.toindex %117 : !felt.type<"babybear"> {product_source = "constrain"} + %119 = array.read %0[%118] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %119, %116 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %120 = struct.readm %39[@out] : <@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %122 = array.read %120[%121] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %123 = felt.add %73, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %124 = cast.toindex %123 : !felt.type<"babybear"> {product_source = "constrain"} + %125 = array.read %0[%124] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %125, %122 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %126 = struct.readm %1[@out] : <@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %128 = array.read %126[%127] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %129 = felt.add %73, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %130 = cast.toindex %129 : !felt.type<"babybear"> {product_source = "constrain"} + %131 = array.read %0[%130] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %131, %128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %132 = struct.readm %27[@out] : <@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %134 = array.read %132[%133] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %135 = felt.add %73, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %136 = cast.toindex %135 : !felt.type<"babybear"> {product_source = "constrain"} + %137 = array.read %0[%136] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %137, %134 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %138 = struct.readm %3[@out] : <@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %140 = array.read %138[%139] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %141 = felt.add %73, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %142 = cast.toindex %141 : !felt.type<"babybear"> {product_source = "constrain"} + %143 = array.read %0[%142] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %143, %140 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %144 = struct.readm %41[@out] : <@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %146 = array.read %144[%145] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %147 = felt.add %73, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %148 = cast.toindex %147 : !felt.type<"babybear"> {product_source = "constrain"} + %149 = array.read %0[%148] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %149, %146 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %150 = struct.readm %31[@out] : <@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %152 = array.read %150[%151] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %153 = felt.add %73, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %154 = cast.toindex %153 : !felt.type<"babybear"> {product_source = "constrain"} + %155 = array.read %0[%154] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %155, %152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %156 = struct.readm %7[@out] : <@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %157 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %156[%157] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = felt.add %73, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %159 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %47[@out] : <@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = felt.add %73, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %166 = cast.toindex %165 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %0[%166] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = struct.readm %43[@out] : <@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %168[%169] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = felt.add %73, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %172 = cast.toindex %171 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %0[%172] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = struct.readm %11[@out] : <@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %174[%175] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = felt.add %73, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %178 = cast.toindex %177 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %0[%178] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = struct.readm %15[@out] : <@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %181 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %180[%181] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = felt.add %73, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %184 = cast.toindex %183 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %0[%184] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %186 = struct.readm %33[@out] : <@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %187 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %188 = array.read %186[%187] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %189 = felt.add %73, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %190 = cast.toindex %189 : !felt.type<"babybear"> {product_source = "constrain"} + %191 = array.read %0[%190] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %191, %188 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %9[@out] : <@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %73, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %0[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %45[@out] : <@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = felt.add %73, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %202 = cast.toindex %201 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %0[%202] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = struct.readm %23[@out] : <@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %205 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %204[%205] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = felt.add %73, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = struct.readm %35[@out] : <@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %211 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %210[%211] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = felt.add %73, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %214 = cast.toindex %213 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %0[%214] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = struct.readm %37[@out] : <@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %217 = cast.toindex %73 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %216[%217] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = felt.add %73, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %220 = cast.toindex %219 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %0[%220] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %49 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_43::@stepRhoPi_43::@constrain(%7, %49) : (!struct.type<@stepRhoPi_43::@stepRhoPi_43<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %50 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_70::@stepRhoPi_70::@constrain(%35, %50) : (!struct.type<@stepRhoPi_70::@stepRhoPi_70<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %51 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_25::@stepRhoPi_25::@constrain(%39, %51) : (!struct.type<@stepRhoPi_25::@stepRhoPi_25<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %52 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_52::@stepRhoPi_52::@constrain(%11, %52) : (!struct.type<@stepRhoPi_52::@stepRhoPi_52<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %53 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_13::@stepRhoPi_13::@constrain(%21, %53) : (!struct.type<@stepRhoPi_13::@stepRhoPi_13<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %54 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_16::@stepRhoPi_16::@constrain(%13, %54) : (!struct.type<@stepRhoPi_16::@stepRhoPi_16<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %55 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_4::@stepRhoPi_4::@constrain(%25, %55) : (!struct.type<@stepRhoPi_4::@stepRhoPi_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %56 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_10::@stepRhoPi_10::@constrain(%29, %56) : (!struct.type<@stepRhoPi_10::@stepRhoPi_10<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %57 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_64::@stepRhoPi_64::@constrain(%45, %57) : (!struct.type<@stepRhoPi_64::@stepRhoPi_64<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %58 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_46::@stepRhoPi_46::@constrain(%47, %58) : (!struct.type<@stepRhoPi_46::@stepRhoPi_46<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %59 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_22::@stepRhoPi_22::@constrain(%19, %59) : (!struct.type<@stepRhoPi_22::@stepRhoPi_22<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %60 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_73::@stepRhoPi_73::@constrain(%37, %60) : (!struct.type<@stepRhoPi_73::@stepRhoPi_73<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %61 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_7::@stepRhoPi_7::@constrain(%17, %61) : (!struct.type<@stepRhoPi_7::@stepRhoPi_7<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %62 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_49::@stepRhoPi_49::@constrain(%43, %62) : (!struct.type<@stepRhoPi_49::@stepRhoPi_49<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %63 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_34::@stepRhoPi_34::@constrain(%3, %63) : (!struct.type<@stepRhoPi_34::@stepRhoPi_34<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %64 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_37::@stepRhoPi_37::@constrain(%41, %64) : (!struct.type<@stepRhoPi_37::@stepRhoPi_37<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %65 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_19::@stepRhoPi_19::@constrain(%5, %65) : (!struct.type<@stepRhoPi_19::@stepRhoPi_19<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %66 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_61::@stepRhoPi_61::@constrain(%9, %66) : (!struct.type<@stepRhoPi_61::@stepRhoPi_61<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %67 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_28::@stepRhoPi_28::@constrain(%1, %67) : (!struct.type<@stepRhoPi_28::@stepRhoPi_28<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %68 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_40::@stepRhoPi_40::@constrain(%31, %68) : (!struct.type<@stepRhoPi_40::@stepRhoPi_40<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %69 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_67::@stepRhoPi_67::@constrain(%23, %69) : (!struct.type<@stepRhoPi_67::@stepRhoPi_67<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %70 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_58::@stepRhoPi_58::@constrain(%33, %70) : (!struct.type<@stepRhoPi_58::@stepRhoPi_58<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %71 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_55::@stepRhoPi_55::@constrain(%15, %71) : (!struct.type<@stepRhoPi_55::@stepRhoPi_55<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %72 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @stepRhoPi_31::@stepRhoPi_31::@constrain(%27, %72) : (!struct.type<@stepRhoPi_31::@stepRhoPi_31<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/sign_test.llzk b/examples/circom-demo/sign_test.llzk new file mode 100644 index 0000000..938a60b --- /dev/null +++ b/examples/circom-demo/sign_test.llzk @@ -0,0 +1,629 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Sign_2::@Sign_2<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<135 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c135 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c135 = arith.constant 135 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c135 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CompConstant_1 { + struct.def @CompConstant_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @parts : !array.type<127 x !felt.type<"babybear">> + struct.member @sout : !felt.type<"babybear"> + struct.member @num2bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @num2bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "compute"} + scf.if %35 { + %42 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg3, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%49] = %48 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "compute"} + scf.if %44 { + %45 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.mul %arg4, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %52, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = bool.and %45, %true : i1, i1 {product_source = "compute"} + scf.if %46 { + %47 = felt.mul %arg3, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = felt.add %50, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%52] = %51 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %47 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.add %49, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%51] = %50 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %nondet[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %arg2, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.sub %arg3, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %38, %39, %40, %41 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#0 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_0::@Num2Bits_0::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %20 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@parts] : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@sout] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %self[@num2bits] : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %12 = struct.readm %self[@num2bits$inputs] : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_340282366920938463463374607431768211455, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.bit_and %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.bit_and %24, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %26 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg0[%27] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %18, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %29, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.and %33, %34 : i1, i1 {product_source = "constrain"} + scf.if %35 { + %42 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %42, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.mul %43, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg4, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.add %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %9[%49] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %42 = bool.cmp eq(%25, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%21, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = bool.and %42, %43 : i1, i1 {product_source = "constrain"} + scf.if %44 { + %45 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.mul %45, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.mul %arg5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.sub %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %52, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %9[%54] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %45 = bool.cmp eq(%21, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = bool.and %45, %true : i1, i1 {product_source = "constrain"} + scf.if %46 { + %47 = felt.mul %arg4, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %arg5, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.add %50, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %9[%52] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %47 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = felt.mul %47, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.mul %48, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.add %49, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %9[%51] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %36 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %9[%36] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %arg3, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %arg4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %arg5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg2, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %41, %38, %39, %40 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %10, %13#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %11[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%11, %17) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CompConstant_1::@CompConstant_1<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %c127 = arith.constant 127 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0:4 = scf.for %arg1 = %c0 to %c127 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_340282366920938463463374607431768211455, %arg4 = %felt_const_1, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.bit_and %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.bit_and %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %8, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg0[%21] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = bool.and %23, %24 : i1, i1 {product_source = "compute"} + scf.if %25 { + %32 = felt.neg %arg3 : !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.mul %32, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.mul %33, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg3, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %32 = bool.cmp eq(%15, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = bool.cmp eq(%11, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = bool.and %32, %33 : i1, i1 {product_source = "compute"} + scf.if %34 { + %35 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.mul %35, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = felt.mul %arg4, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.sub %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = felt.add %42, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%44] = %43 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %35 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = bool.and %35, %true : i1, i1 {product_source = "compute"} + scf.if %36 { + %37 = felt.mul %arg3, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %arg4, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = felt.add %40, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%42] = %41 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %37 = felt.neg %arg4 : !felt.type<"babybear"> {product_source = "compute"} + %38 = felt.mul %37, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = felt.mul %38, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %39, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %40 : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet[%26] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %arg2, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %arg3, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.add %arg4, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %arg5, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %28, %29, %30, %31 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@sout] = %0#0 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0#0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "compute"} + %6 = array.read %5[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %6 : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@num2bits$inputs] = %pod_0 : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@num2bits] = %7 : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@parts] = %nondet : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CompConstant_1::@CompConstant_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant 1 : index + %c127 = arith.constant 127 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_340282366920938463463374607431768211455 = felt.const 340282366920938463463374607431768211455 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@parts] : <@CompConstant_1::@CompConstant_1<[]>>, !array.type<127 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@sout] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = struct.readm %arg0[@num2bits] : <@CompConstant_1::@CompConstant_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@num2bits$inputs] : <@CompConstant_1::@CompConstant_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5:4 = scf.for %arg2 = %c0 to %c127 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_340282366920938463463374607431768211455, %arg6 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.bit_and %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.shr %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.bit_and %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%19] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = bool.and %25, %26 : i1, i1 {product_source = "constrain"} + scf.if %27 { + %34 = felt.neg %arg5 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.mul %34, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = felt.mul %35, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.add %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %1[%41] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %34 = bool.cmp eq(%17, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = bool.cmp eq(%13, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = bool.and %34, %35 : i1, i1 {product_source = "constrain"} + scf.if %36 { + %37 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.mul %37, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.mul %arg6, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %44, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %1[%46] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %37 = bool.cmp eq(%13, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = bool.and %37, %true : i1, i1 {product_source = "constrain"} + scf.if %38 { + %39 = felt.mul %arg5, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %arg6, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %42, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %1[%44] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %39 = felt.neg %arg6 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = felt.mul %40, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.add %41, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %28 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %1[%28] : <127 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %arg4, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.sub %arg5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.add %arg6, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %arg3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %33, %30, %31, %32 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %2, %5#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<135 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c127] : <135 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %9) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Sign_2 { + struct.def @Sign_2 { + struct.member @sign : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@CompConstant_1::@CompConstant_1<[]>> + struct.member @comp$inputs : !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_2::@Sign_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_2::@Sign_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@sign] : <@Sign_2::@Sign_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@Sign_2::@Sign_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@Sign_2::@Sign_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %11 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @CompConstant_1::@CompConstant_1::@product(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> + %24 = function.call @CompConstant_1::@CompConstant_1::@compute(%22) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %4 : <@Sign_2::@Sign_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_2::@Sign_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %5 : <@Sign_2::@Sign_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_1::@CompConstant_1::@constrain(%1, %7) : (!struct.type<@CompConstant_1::@CompConstant_1<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Sign_2::@Sign_2<[]>> + } + function.def @compute(%arg0: !array.type<254 x !felt.type<"babybear">>) -> !struct.type<@Sign_2::@Sign_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c254 = arith.constant {product_source = "compute"} 254 : index + %self = struct.new : <@Sign_2::@Sign_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c254 } : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c254 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @CompConstant_1::@CompConstant_1::@compute(%11) : (!array.type<254 x !felt.type<"babybear">>) -> !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sign] = %1 : <@Sign_2::@Sign_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@Sign_2::@Sign_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CompConstant_1::@CompConstant_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %2 : <@Sign_2::@Sign_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Sign_2::@Sign_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Sign_2::@Sign_2<[]>>, %arg1: !array.type<254 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c254 = arith.constant 254 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@sign] : <@Sign_2::@Sign_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@Sign_2::@Sign_2<[]>>, !struct.type<@CompConstant_1::@CompConstant_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@Sign_2::@Sign_2<[]>>, !pod.type<[@in: !array.type<254 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c254 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%6] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <254 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@CompConstant_1::@CompConstant_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<254 x !felt.type<"babybear">>]>, !array.type<254 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CompConstant_1::@CompConstant_1::@constrain(%1, %4) : (!struct.type<@CompConstant_1::@CompConstant_1<[]>>, !array.type<254 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/splicer_test.llzk b/examples/circom-demo/splicer_test.llzk new file mode 100644 index 0000000..0b5e952 --- /dev/null +++ b/examples/circom-demo/splicer_test.llzk @@ -0,0 +1,1788 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Splicer_9::@Splicer_9<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @GreaterThan_2 { + struct.def @GreaterThan_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@product(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %26 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %24 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @LessThan_1::@LessThan_1::@compute(%24) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %13 = struct.readm %self[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %self[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %14[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %23) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %13 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @LessThan_1::@LessThan_1::@compute(%13) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %11 : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %12 : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@GreaterThan_2::@GreaterThan_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@GreaterThan_2::@GreaterThan_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = array.read %7[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%1, %10) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CalculateTotal_3 { + struct.def @CalculateTotal_3 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @sums : !array.type<5 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@CalculateTotal_3::@CalculateTotal_3<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c1 to %c5 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %3 = felt.sub %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %2 : !felt.type<"babybear"> + %7 = array.read %arg0[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %1 = array.read %nondet[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@sum] = %1 : <@CalculateTotal_3::@CalculateTotal_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@sums] = %nondet : <@CalculateTotal_3::@CalculateTotal_3<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@CalculateTotal_3::@CalculateTotal_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@sums] : <@CalculateTotal_3::@CalculateTotal_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %2 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c5 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = felt.sub %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = array.read %1[%7] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %5 : !felt.type<"babybear"> + %13 = array.read %1[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %4 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @IsZero_4 { + struct.def @IsZero_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_4::@IsZero_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_4::@IsZero_4<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_4::@IsZero_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_4::@IsZero_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_4::@IsZero_4<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsEqual_5 { + struct.def @IsEqual_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_4::@IsZero_4<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @IsZero_4::@IsZero_4::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_4::@IsZero_4<[]>> + %20 = function.call @IsZero_4::@IsZero_4::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_5::@IsEqual_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_5::@IsEqual_5<[]>>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@isz] : <@IsEqual_5::@IsEqual_5<[]>>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@isz$inputs] : <@IsEqual_5::@IsEqual_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_4::@IsZero_4::@constrain(%10, %17) : (!struct.type<@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsEqual_5::@IsEqual_5<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @IsZero_4::@IsZero_4::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_5::@IsEqual_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_4::@IsZero_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_5::@IsEqual_5<[]>>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsEqual_5::@IsEqual_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isz] : <@IsEqual_5::@IsEqual_5<[]>>, !struct.type<@IsZero_4::@IsZero_4<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_5::@IsEqual_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_4::@IsZero_4::@constrain(%1, %8) : (!struct.type<@IsZero_4::@IsZero_4<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @QuinSelector_6 { + struct.def @QuinSelector_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @calcTotal : !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + struct.member @calcTotal$inputs : !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> + struct.member @eqs : !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> + struct.member @eqs$inputs : !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @lessThan : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lessThan$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_5 = felt.const 5 : <"babybear"> + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %self = struct.new : <@QuinSelector_6::@QuinSelector_6<[]>> + %pod = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@nums: !array.type<5 x !felt.type<"babybear">>]> + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %12 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %12 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %pod_2 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> + %pod_3 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_3[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %1 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod_2[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %12 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = function.call @LessThan_1::@LessThan_1::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod_2[@comp] = %13 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %4 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %4[%c1] = %felt_const_5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_3[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod_2[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %12 = pod.read %pod_3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = function.call @LessThan_1::@LessThan_1::@compute(%12) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod_2[@comp] = %13 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %array_1[%13] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %15 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %15[%c0] = %12 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %12 : !felt.type<"babybear"> + %17 = array.read %array_1[%16] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %17[@in] = %15 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %18 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_1[%18] = %17 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %19 = cast.toindex %12 : !felt.type<"babybear"> + %20 = array.read %array[%19] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@count] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.subi %21, %c1 : index + pod.write %20[@count] = %22 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.cmpi eq, %22, %c0 : index + scf.if %23 { + %47 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %48 = function.call @IsEqual_5::@IsEqual_5::@compute(%47) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> + pod.write %20[@comp] = %48 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + %49 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%49] = %20 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + } + %24 = cast.toindex %12 : !felt.type<"babybear"> + %25 = array.read %array_1[%24] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %26 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %26[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = cast.toindex %12 : !felt.type<"babybear"> + %28 = array.read %array_1[%27] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %28[@in] = %26 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %29 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_1[%29] = %28 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %30 = cast.toindex %12 : !felt.type<"babybear"> + %31 = array.read %array[%30] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %47 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %48 = function.call @IsEqual_5::@IsEqual_5::@compute(%47) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> + pod.write %31[@comp] = %48 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + %49 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%49] = %31 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + } + %35 = cast.toindex %12 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + %38 = struct.readm %37[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> + %39 = cast.toindex %12 : !felt.type<"babybear"> + %40 = array.read %arg0[%39] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = felt.mul %38, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = pod.read %pod_0[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %43 = cast.toindex %12 : !felt.type<"babybear"> + array.write %42[%43] = %41 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@nums] = %42 : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %44 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, @params: !pod.type<[]>]>, index + %45 = arith.subi %44, %c1 : index + pod.write %pod[@count] = %45 : <[@count: index, @comp: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, @params: !pod.type<[]>]>, index + %46 = arith.cmpi eq, %45, %c0 : index + scf.if %46 { + %47 = pod.read %pod_0[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %48 = function.call @CalculateTotal_3::@CalculateTotal_3::@compute(%47) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + pod.write %pod[@comp] = %48 : <[@count: index, @comp: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + } + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + %9 = struct.readm %8[@sum] : <@CalculateTotal_3::@CalculateTotal_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %9 : <@QuinSelector_6::@QuinSelector_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@calcTotal$inputs] = %pod_0 : <@QuinSelector_6::@QuinSelector_6<[]>>, !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + struct.writem %self[@calcTotal] = %10 : <@QuinSelector_6::@QuinSelector_6<[]>>, !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + struct.writem %self[@eqs$inputs] = %array_1 : <@QuinSelector_6::@QuinSelector_6<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_4 = array.new : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %12 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + array.write %array_4[%arg2] = %13 : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + } + struct.writem %self[@eqs] = %array_4 : <@QuinSelector_6::@QuinSelector_6<[]>>, !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> + struct.writem %self[@lessThan$inputs] = %pod_3 : <@QuinSelector_6::@QuinSelector_6<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %11 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.writem %self[@lessThan] = %11 : <@QuinSelector_6::@QuinSelector_6<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + function.return %self : !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_5 = felt.const 5 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@QuinSelector_6::@QuinSelector_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@calcTotal] : <@QuinSelector_6::@QuinSelector_6<[]>>, !struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>> + %2 = struct.readm %arg0[@calcTotal$inputs] : <@QuinSelector_6::@QuinSelector_6<[]>>, !pod.type<[@nums: !array.type<5 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@eqs] : <@QuinSelector_6::@QuinSelector_6<[]>>, !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> + %4 = struct.readm %arg0[@eqs$inputs] : <@QuinSelector_6::@QuinSelector_6<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@lessThan] : <@QuinSelector_6::@QuinSelector_6<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %6 = struct.readm %arg0[@lessThan$inputs] : <@QuinSelector_6::@QuinSelector_6<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %7 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %8 = array.read %7[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %10 = array.read %9[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %felt_const_5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = struct.readm %5[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + constrain.eq %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %4[%16] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %18 = pod.read %17[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %4[%20] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %23 = array.read %22[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %15 : !felt.type<"babybear"> + %25 = array.read %3[%24] : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + %26 = struct.readm %25[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> + %27 = cast.toindex %15 : !felt.type<"babybear"> + %28 = array.read %arg1[%27] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.mul %26, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = pod.read %2[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %31 = cast.toindex %15 : !felt.type<"babybear"> + %32 = array.read %30[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = struct.readm %1[@sum] : <@CalculateTotal_3::@CalculateTotal_3<[]>>, !felt.type<"babybear"> + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = pod.read %2[@nums] : <[@nums: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + function.call @CalculateTotal_3::@CalculateTotal_3::@constrain(%1, %13) : (!struct.type<@CalculateTotal_3::@CalculateTotal_3<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () + scf.for %arg3 = %c0 to %c5 step %c1 { + %15 = array.read %3[%arg3] : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> + %16 = array.read %4[%arg3] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @IsEqual_5::@IsEqual_5::@constrain(%15, %17) : (!struct.type<@IsEqual_5::@IsEqual_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + %14 = pod.read %6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_1::@LessThan_1::@constrain(%5, %14) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @MultiMux1_7 { + struct.def @MultiMux1_7 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux1_7::@MultiMux1_7<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %arg0[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.add %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %5 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@MultiMux1_7::@MultiMux1_7<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, %arg1: !array.type<1,2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux1_7::@MultiMux1_7<[]>>, !array.type<1 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %arg1[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux1_8 { + struct.def @Mux1_8 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@Mux1_8::@Mux1_8<[]>> + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + scf.for %arg2 = %c0 to %c2 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg0[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + array.write %10[%c0, %11] = %9 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %10 : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.subi %12, %c1 : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.cmpi eq, %13, %c0 : index + scf.if %14 { + %15 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %16 = pod.read %pod_0[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = function.call @MultiMux1_7::@MultiMux1_7::@compute(%15, %16) : (!array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + pod.write %pod[@comp] = %17 : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + } + } + pod.write %pod_0[@s] = %arg1 : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %8 = pod.read %pod_0[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @MultiMux1_7::@MultiMux1_7::@compute(%7, %8) : (!array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + %4 = struct.readm %3[@out] : <@MultiMux1_7::@MultiMux1_7<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@Mux1_8::@Mux1_8<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux1_8::@Mux1_8<[]>>, !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + struct.writem %self[@mux] = %6 : <@Mux1_8::@Mux1_8<[]>>, !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + function.return %self : !struct.type<@Mux1_8::@Mux1_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux1_8::@Mux1_8<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux1_8::@Mux1_8<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux1_8::@Mux1_8<[]>>, !struct.type<@MultiMux1_7::@MultiMux1_7<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux1_8::@Mux1_8<[]>>, !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + scf.for %arg3 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %2[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %11[%c0, %12] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = pod.read %2[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = struct.readm %1[@out] : <@MultiMux1_7::@MultiMux1_7<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %7 = pod.read %2[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @MultiMux1_7::@MultiMux1_7::@constrain(%1, %6, %7) : (!struct.type<@MultiMux1_7::@MultiMux1_7<[]>>, !array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Splicer_9 { + struct.def @Splicer_9 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + struct.member @muxes : !array.type<5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> + struct.member @muxes$inputs : !array.type<5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> + struct.member @isLeafIndex : !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> + struct.member @isLeafIndex$inputs : !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @quinSelectors : !array.type<5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> + struct.member @quinSelectors$inputs : !array.type<5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> + struct.member @greaterThan : !array.type<5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> + struct.member @greaterThan$inputs : !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Splicer_9::@Splicer_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %c6 = arith.constant {product_source = "compute"} 6 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Splicer_9::@Splicer_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c3 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3] = %9 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array_1[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3] = %9 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array_3[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c6 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3] = %9 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array_5[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %9[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg3] = %9 : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array_6[%10] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %12[%c0] = %9 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_6[%13] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %14[@in] = %12 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%15] = %14 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_5[%16] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %124 = pod.read %14[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = function.call @GreaterThan_2::@GreaterThan_2::@product(%124) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> + %126 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%124) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %17[@comp] = %125 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%127] = %17 : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %21 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_6[%21] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %arg2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_6[%24] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %25[@in] = %23 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%26] = %25 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_5[%27] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %124 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%124) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %28[@comp] = %125 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %126 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%126] = %28 : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_5[%32] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %34 = pod.read %33[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %35 = struct.readm %34[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.sub %9, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_4[%37] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %38[@index] = %36 : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%39] = %38 : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %40 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_3[%40] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %42 = pod.read %41[@count] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %41[@count] = %43 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %124 = pod.read %38[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %125 = pod.read %38[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @QuinSelector_6::@QuinSelector_6::@compute(%124, %125) : (!array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + pod.write %41[@comp] = %126 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%127] = %41 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %45 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %46 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %47 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %45 to %46 step %47 { + %124 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %125 = bool.cmp lt(%124, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %126 = cast.toindex %124 : !felt.type<"babybear"> {product_source = "compute"} + %127 = array.read %arg0[%126] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %128 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %129 = array.read %array_4[%128] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %130 = pod.read %129[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %131 = cast.toindex %124 : !felt.type<"babybear"> {product_source = "compute"} + array.write %130[%131] = %127 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %132 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %133 = array.read %array_4[%132] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %133[@in] = %130 : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %134 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%134] = %133 : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %135 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %136 = array.read %array_3[%135] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %137 = pod.read %136[@count] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %138 = arith.subi %137, %c1 {product_source = "compute"} : index + pod.write %136[@count] = %138 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %139 = arith.cmpi eq, %138, %c0 {product_source = "compute"} : index + scf.if %139 { + %141 = pod.read %133[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %142 = pod.read %133[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %143 = function.call @QuinSelector_6::@QuinSelector_6::@compute(%141, %142) : (!array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + pod.write %136[@comp] = %143 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %144 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%144] = %136 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %140 = felt.add %124, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + %48 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array_4[%48] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %50 = pod.read %49[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + array.write %50[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %array_4[%51] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %52[@in] = %50 : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%53] = %52 : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %54 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_3[%54] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %56 = pod.read %55[@count] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %55[@count] = %57 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %124 = pod.read %52[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %125 = pod.read %52[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @QuinSelector_6::@QuinSelector_6::@compute(%124, %125) : (!array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + pod.write %55[@comp] = %126 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%127] = %55 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %59 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array_2[%59] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %61 = pod.read %60[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %61[%c0] = %arg2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_2[%62] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %63[@in] = %61 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%64] = %63 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %65 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_1[%65] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@count] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %68 = arith.subi %67, %c1 {product_source = "compute"} : index + pod.write %66[@count] = %68 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.cmpi eq, %68, %c0 {product_source = "compute"} : index + scf.if %69 { + %124 = pod.read %63[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = function.call @IsEqual_5::@IsEqual_5::@product(%124) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> + %126 = function.call @IsEqual_5::@IsEqual_5::@compute(%124) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + pod.write %66[@comp] = %125 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%127] = %66 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %70 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_2[%70] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %72 = pod.read %71[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %72[%c1] = %9 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %74 = array.read %array_2[%73] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %74[@in] = %72 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %75 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%75] = %74 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %76 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %array_1[%76] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %78 = pod.read %77[@count] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %79 = arith.subi %78, %c1 {product_source = "compute"} : index + pod.write %77[@count] = %79 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %80 = arith.cmpi eq, %79, %c0 {product_source = "compute"} : index + scf.if %80 { + %124 = pod.read %74[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = function.call @IsEqual_5::@IsEqual_5::@compute(%124) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + pod.write %77[@comp] = %125 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %126 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%126] = %77 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %81 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_1[%81] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %83 = pod.read %82[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %84 = struct.readm %83[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_0[%85] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %86[@s] = %84 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %87 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%87] = %86 : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %88 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array[%88] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %90 = pod.read %89[@count] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %91 = arith.subi %90, %c1 {product_source = "compute"} : index + pod.write %89[@count] = %91 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.cmpi eq, %91, %c0 {product_source = "compute"} : index + scf.if %92 { + %124 = pod.read %86[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = pod.read %86[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Mux1_8::@Mux1_8::@compute(%124, %125) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + pod.write %89[@comp] = %126 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%127] = %89 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %93 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %94 = array.read %array_3[%93] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %95 = pod.read %94[@comp] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %96 = struct.readm %95[@out] : <@QuinSelector_6::@QuinSelector_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %97 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %98 = array.read %array_0[%97] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %99 = pod.read %98[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %99[%c0] = %96 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %100 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %101 = array.read %array_0[%100] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %101[@c] = %99 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %102 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%102] = %101 : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %103 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %104 = array.read %array[%103] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %105 = pod.read %104[@count] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %106 = arith.subi %105, %c1 {product_source = "compute"} : index + pod.write %104[@count] = %106 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %107 = arith.cmpi eq, %106, %c0 {product_source = "compute"} : index + scf.if %107 { + %124 = pod.read %101[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = pod.read %101[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Mux1_8::@Mux1_8::@compute(%124, %125) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + pod.write %104[@comp] = %126 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%127] = %104 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %108 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %109 = array.read %array_0[%108] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %110 = pod.read %109[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %110[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %111 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %112 = array.read %array_0[%111] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %112[@c] = %110 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %113 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%113] = %112 : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %114 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %115 = array.read %array[%114] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %116 = pod.read %115[@count] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %117 = arith.subi %116, %c1 {product_source = "compute"} : index + pod.write %115[@count] = %117 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %118 = arith.cmpi eq, %117, %c0 {product_source = "compute"} : index + scf.if %118 { + %124 = pod.read %112[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %125 = pod.read %112[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %126 = function.call @Mux1_8::@Mux1_8::@compute(%124, %125) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + pod.write %115[@comp] = %126 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %127 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%127] = %115 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %119 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %120 = array.read %array[%119] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %121 = pod.read %120[@comp] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %122 = struct.readm %121[@out] : <@Mux1_8::@Mux1_8<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%123] = %122 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@quinSelectors$inputs] = %array_4 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array_3[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + array.write %array_7[%arg3] = %10 : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@quinSelectors] = %array_7 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> {product_source = "compute"} + struct.writem %self[@isLeafIndex$inputs] = %array_2 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_8 = array.new : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array_1[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + array.write %array_8[%arg3] = %10 : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@isLeafIndex] = %array_8 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> {product_source = "compute"} + struct.writem %self[@muxes$inputs] = %array_0 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> {product_source = "compute"} + %array_9 = array.new : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + array.write %array_9[%arg3] = %10 : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@muxes] = %array_9 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> {product_source = "compute"} + struct.writem %self[@greaterThan$inputs] = %array_6 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_10 = array.new : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %array_5[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_10[%arg3] = %10 : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@greaterThan] = %array_10 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@muxes] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@muxes$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> {product_source = "constrain"} + %3 = struct.readm %self[@isLeafIndex] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> {product_source = "constrain"} + %4 = struct.readm %self[@isLeafIndex$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %self[@quinSelectors] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@quinSelectors$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %self[@greaterThan] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %8 = struct.readm %self[@greaterThan$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %8[%10] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = array.read %12[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %8[%14] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %7[%18] : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %20 = struct.readm %19[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.sub %9, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %6[%22] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %24 = pod.read %23[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %26 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %27 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %25 to %26 step %27 { + %62 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %63 = bool.cmp lt(%62, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %arg0[%64] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %6[%66] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %68 = pod.read %67[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %68[%69] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %70, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %62, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + %28 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %6[%28] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = array.read %30[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %4[%32] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = pod.read %33[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = array.read %34[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %4[%36] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = array.read %38[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %3[%40] : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "constrain"} + %42 = struct.readm %41[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %2[%43] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %5[%46] : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "constrain"} + %48 = struct.readm %47[@out] : <@QuinSelector_6::@QuinSelector_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %2[%49] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = array.read %51[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %2[%53] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %55 = pod.read %54[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = array.read %55[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %1[%57] : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "constrain"} + %59 = struct.readm %58[@out] : <@Mux1_8::@Mux1_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %0[%60] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %5[%arg3] : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "constrain"} + %10 = array.read %6[%arg3] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %10[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @QuinSelector_6::@QuinSelector_6::@constrain(%9, %11, %12) : (!struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, !array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %3[%arg3] : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "constrain"} + %10 = array.read %4[%arg3] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_5::@IsEqual_5::@constrain(%9, %11) : (!struct.type<@IsEqual_5::@IsEqual_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %1[%arg3] : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "constrain"} + %10 = array.read %2[%arg3] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %10[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Mux1_8::@Mux1_8::@constrain(%9, %11, %12) : (!struct.type<@Mux1_8::@Mux1_8<[]>>, !array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %9 = array.read %7[%arg3] : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %10 = array.read %8[%arg3] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%9, %11) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Splicer_9::@Splicer_9<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !struct.type<@Splicer_9::@Splicer_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %c6 = arith.constant {product_source = "compute"} 6 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@Splicer_9::@Splicer_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg3] = %0 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array_1[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg3] = %0 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array_3[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c6 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg3] = %0 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> {product_source = "compute"} + %array_5 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array_5[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg3] = %0 : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %array_6[%1] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %3[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array_6[%4] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %5[@in] = %3 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%6] = %5 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array_5[%7] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %8[@count] = %10 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %115 = pod.read %5[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%115) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %8[@comp] = %116 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %117 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%117] = %8 : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array_6[%12] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %13[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %14[%c1] = %arg2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array_6[%15] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %16[@in] = %14 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%17] = %16 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_5[%18] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %115 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = function.call @GreaterThan_2::@GreaterThan_2::@compute(%115) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + pod.write %19[@comp] = %116 : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %117 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%117] = %19 : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %23 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_5[%23] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + %26 = struct.readm %25[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.sub %0, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_4[%28] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %29[@index] = %27 : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%30] = %29 : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %31 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_3[%31] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %115 = pod.read %29[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %116 = pod.read %29[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = function.call @QuinSelector_6::@QuinSelector_6::@compute(%115, %116) : (!array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + pod.write %32[@comp] = %117 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %118 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%118] = %32 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %36 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %37 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %38 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg4 = %36 to %37 step %38 { + %115 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %116 = bool.cmp lt(%115, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %117 = cast.toindex %115 : !felt.type<"babybear"> {product_source = "compute"} + %118 = array.read %arg0[%117] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %119 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %120 = array.read %array_4[%119] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %121 = pod.read %120[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %122 = cast.toindex %115 : !felt.type<"babybear"> {product_source = "compute"} + array.write %121[%122] = %118 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %123 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %124 = array.read %array_4[%123] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %124[@in] = %121 : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %125 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%125] = %124 : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %126 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %127 = array.read %array_3[%126] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %128 = pod.read %127[@count] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %129 = arith.subi %128, %c1 {product_source = "compute"} : index + pod.write %127[@count] = %129 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %130 = arith.cmpi eq, %129, %c0 {product_source = "compute"} : index + scf.if %130 { + %132 = pod.read %124[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %133 = pod.read %124[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %134 = function.call @QuinSelector_6::@QuinSelector_6::@compute(%132, %133) : (!array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + pod.write %127[@comp] = %134 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %135 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%135] = %127 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %131 = felt.add %115, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + %39 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_4[%39] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %41 = pod.read %40[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + array.write %41[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_4[%42] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %43[@in] = %41 : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %44 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%44] = %43 : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "compute"} + %45 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %array_3[%45] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %47 = pod.read %46[@count] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %48 = arith.subi %47, %c1 {product_source = "compute"} : index + pod.write %46[@count] = %48 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.cmpi eq, %48, %c0 {product_source = "compute"} : index + scf.if %49 { + %115 = pod.read %43[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %116 = pod.read %43[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = function.call @QuinSelector_6::@QuinSelector_6::@compute(%115, %116) : (!array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + pod.write %46[@comp] = %117 : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %118 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%118] = %46 : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %50 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_2[%50] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %52 = pod.read %51[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %52[%c0] = %arg2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %array_2[%53] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %54[@in] = %52 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %55 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%55] = %54 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %56 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %57 = array.read %array_1[%56] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %58 = pod.read %57[@count] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.subi %58, %c1 {product_source = "compute"} : index + pod.write %57[@count] = %59 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %60 = arith.cmpi eq, %59, %c0 {product_source = "compute"} : index + scf.if %60 { + %115 = pod.read %54[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = function.call @IsEqual_5::@IsEqual_5::@compute(%115) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + pod.write %57[@comp] = %116 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %117 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%117] = %57 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %61 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %array_2[%61] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %63 = pod.read %62[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %63[%c1] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %64 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %65 = array.read %array_2[%64] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %65[@in] = %63 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %66 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%66] = %65 : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %67 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %68 = array.read %array_1[%67] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %69 = pod.read %68[@count] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.subi %69, %c1 {product_source = "compute"} : index + pod.write %68[@count] = %70 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %71 = arith.cmpi eq, %70, %c0 {product_source = "compute"} : index + scf.if %71 { + %115 = pod.read %65[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = function.call @IsEqual_5::@IsEqual_5::@compute(%115) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + pod.write %68[@comp] = %116 : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %117 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%117] = %68 : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %72 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %73 = array.read %array_1[%72] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %74 = pod.read %73[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + %75 = struct.readm %74[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %76 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %77 = array.read %array_0[%76] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %77[@s] = %75 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %78 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%78] = %77 : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %79 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %array[%79] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %81 = pod.read %80[@count] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %82 = arith.subi %81, %c1 {product_source = "compute"} : index + pod.write %80[@count] = %82 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %83 = arith.cmpi eq, %82, %c0 {product_source = "compute"} : index + scf.if %83 { + %115 = pod.read %77[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = pod.read %77[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = function.call @Mux1_8::@Mux1_8::@compute(%115, %116) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + pod.write %80[@comp] = %117 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %118 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%118] = %80 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %84 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_3[%84] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@comp] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + %87 = struct.readm %86[@out] : <@QuinSelector_6::@QuinSelector_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %88 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %89 = array.read %array_0[%88] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %90 = pod.read %89[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %90[%c0] = %87 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %91 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %92 = array.read %array_0[%91] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %92[@c] = %90 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%93] = %92 : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %94 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %95 = array.read %array[%94] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %96 = pod.read %95[@count] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %97 = arith.subi %96, %c1 {product_source = "compute"} : index + pod.write %95[@count] = %97 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %98 = arith.cmpi eq, %97, %c0 {product_source = "compute"} : index + scf.if %98 { + %115 = pod.read %92[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = pod.read %92[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = function.call @Mux1_8::@Mux1_8::@compute(%115, %116) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + pod.write %95[@comp] = %117 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %118 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%118] = %95 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %99 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %100 = array.read %array_0[%99] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %101 = pod.read %100[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %101[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %102 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %103 = array.read %array_0[%102] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %103[@c] = %101 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %104 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%104] = %103 : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %105 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %106 = array.read %array[%105] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %107 = pod.read %106[@count] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %108 = arith.subi %107, %c1 {product_source = "compute"} : index + pod.write %106[@count] = %108 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %109 = arith.cmpi eq, %108, %c0 {product_source = "compute"} : index + scf.if %109 { + %115 = pod.read %103[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %116 = pod.read %103[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %117 = function.call @Mux1_8::@Mux1_8::@compute(%115, %116) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + pod.write %106[@comp] = %117 : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %118 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%118] = %106 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %110 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %111 = array.read %array[%110] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %112 = pod.read %111[@comp] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + %113 = struct.readm %112[@out] : <@Mux1_8::@Mux1_8<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %114 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%114] = %113 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@quinSelectors$inputs] = %array_4 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array_3[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + array.write %array_7[%arg3] = %1 : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@quinSelectors] = %array_7 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> {product_source = "compute"} + struct.writem %self[@isLeafIndex$inputs] = %array_2 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_8 = array.new : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array_1[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_5::@IsEqual_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + array.write %array_8[%arg3] = %1 : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@isLeafIndex] = %array_8 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> {product_source = "compute"} + struct.writem %self[@muxes$inputs] = %array_0 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> {product_source = "compute"} + %array_9 = array.new : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Mux1_8::@Mux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + array.write %array_9[%arg3] = %1 : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@muxes] = %array_9 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> {product_source = "compute"} + struct.writem %self[@greaterThan$inputs] = %array_6 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_10 = array.new : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %0 = array.read %array_5[%arg3] : <5 x !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + array.write %array_10[%arg3] = %1 : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@greaterThan] = %array_10 : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Splicer_9::@Splicer_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Splicer_9::@Splicer_9<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c5 = arith.constant {product_source = "constrain"} 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@muxes] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@Mux1_8::@Mux1_8<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@muxes$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@isLeafIndex] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@isLeafIndex$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@quinSelectors] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@quinSelectors$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@greaterThan] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@greaterThan$inputs] : <@Splicer_9::@Splicer_9<[]>>, !array.type<5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %9 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %8[%10] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = array.read %12[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %8[%14] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %7[%18] : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %20 = struct.readm %19[@out] : <@GreaterThan_2::@GreaterThan_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.sub %9, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %6[%22] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %24 = pod.read %23[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %26 = cast.toindex %felt_const_4 : !felt.type<"babybear"> + %27 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg5 = %25 to %26 step %27 { + %62 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %63 = bool.cmp lt(%62, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %65 = array.read %arg1[%64] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %66 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %67 = array.read %6[%66] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %68 = pod.read %67[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = cast.toindex %62 : !felt.type<"babybear"> {product_source = "constrain"} + %70 = array.read %68[%69] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %70, %65 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %71 = felt.add %62, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + %28 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %6[%28] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = array.read %30[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %4[%32] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %34 = pod.read %33[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = array.read %34[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %4[%36] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = array.read %38[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %3[%40] : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "constrain"} + %42 = struct.readm %41[@out] : <@IsEqual_5::@IsEqual_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %2[%43] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %5[%46] : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "constrain"} + %48 = struct.readm %47[@out] : <@QuinSelector_6::@QuinSelector_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %2[%49] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %51 = pod.read %50[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %52 = array.read %51[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %2[%53] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %55 = pod.read %54[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %56 = array.read %55[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %58 = array.read %1[%57] : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "constrain"} + %59 = struct.readm %58[@out] : <@Mux1_8::@Mux1_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %61 = array.read %0[%60] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %9 = array.read %5[%arg4] : <5 x !struct.type<@QuinSelector_6::@QuinSelector_6<[]>>>, !struct.type<@QuinSelector_6::@QuinSelector_6<[]>> {product_source = "constrain"} + %10 = array.read %6[%arg4] : <5 x !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %10[@index] : <[@in: !array.type<5 x !felt.type<"babybear">>, @index: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @QuinSelector_6::@QuinSelector_6::@constrain(%9, %11, %12) : (!struct.type<@QuinSelector_6::@QuinSelector_6<[]>>, !array.type<5 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %9 = array.read %3[%arg4] : <5 x !struct.type<@IsEqual_5::@IsEqual_5<[]>>>, !struct.type<@IsEqual_5::@IsEqual_5<[]>> {product_source = "constrain"} + %10 = array.read %4[%arg4] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_5::@IsEqual_5::@constrain(%9, %11) : (!struct.type<@IsEqual_5::@IsEqual_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %9 = array.read %1[%arg4] : <5 x !struct.type<@Mux1_8::@Mux1_8<[]>>>, !struct.type<@Mux1_8::@Mux1_8<[]>> {product_source = "constrain"} + %10 = array.read %2[%arg4] : <5 x !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %11 = pod.read %10[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = pod.read %10[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Mux1_8::@Mux1_8::@constrain(%9, %11, %12) : (!struct.type<@Mux1_8::@Mux1_8<[]>>, !array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c5 step %c1 { + %9 = array.read %7[%arg4] : <5 x !struct.type<@GreaterThan_2::@GreaterThan_2<[]>>>, !struct.type<@GreaterThan_2::@GreaterThan_2<[]>> {product_source = "constrain"} + %10 = array.read %8[%arg4] : <5 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = pod.read %10[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @GreaterThan_2::@GreaterThan_2::@constrain(%9, %11) : (!struct.type<@GreaterThan_2::@GreaterThan_2<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/squeeze_test.llzk b/examples/circom-demo/squeeze_test.llzk new file mode 100644 index 0000000..4ba55c4 --- /dev/null +++ b/examples/circom-demo/squeeze_test.llzk @@ -0,0 +1,142 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Squeeze_0::@Squeeze_0<[]>>} { + poly.template @Squeeze_0 { + struct.def @Squeeze_0 { + struct.member @out : !array.type<256 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Squeeze_0::@Squeeze_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c25 = arith.constant 25 : index + %c0 = arith.constant 0 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Squeeze_0::@Squeeze_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Squeeze_0::@Squeeze_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %3 = cast.toindex %felt_const_64 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %2 to %3 step %4 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = bool.cmp lt(%12, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %13 { + %15 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %15, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.add %19, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%21] = %18 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %14 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_64 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %6 to %7 step %8 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %5, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = bool.cmp lt(%12, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %13 { + %15 = felt.mul %5, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.mul %5, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.add %19, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %0[%21] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Squeeze_0::@Squeeze_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@Squeeze_0::@Squeeze_0<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Squeeze_0::@Squeeze_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c25 = arith.constant 25 : index + %c0 = arith.constant 0 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Squeeze_0::@Squeeze_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c25 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %2 = cast.toindex %felt_const_64 : !felt.type<"babybear"> + %3 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg2 = %1 to %2 step %3 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = bool.cmp lt(%4, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.mul %0, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %6, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = bool.cmp lt(%7, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %8 { + %10 = felt.mul %0, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %10, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg0[%12] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.mul %0, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %14, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%16] = %13 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %9 = felt.add %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Squeeze_0::@Squeeze_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Squeeze_0::@Squeeze_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Squeeze_0::@Squeeze_0<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c25 = arith.constant 25 : index + %c0 = arith.constant 0 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Squeeze_0::@Squeeze_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c25 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %2 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %3 = cast.toindex %felt_const_64 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + scf.for %arg3 = %2 to %3 step %4 { + %5 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %6 = bool.cmp lt(%5, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = bool.cmp lt(%8, %felt_const_256) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %9 { + %11 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %11, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%13] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %1, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%17] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %10 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/sum_test.llzk b/examples/circom-demo/sum_test.llzk new file mode 100644 index 0000000..79499a5 --- /dev/null +++ b/examples/circom-demo/sum_test.llzk @@ -0,0 +1,644 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@A_3::@A_3<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BinSum_1 { + struct.def @BinSum_1 { + struct.member @out : !array.type<33 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c33 = arith.constant 33 : index + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_2 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg2) -> (!felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %12 = bool.cmp lt(%11, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%13, %14] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.mul %15, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.add %arg5, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %17 : !felt.type<"babybear"> + } + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %1:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.shr %0#0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.bit_and %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet[%9] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %3:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %7 = cast.toindex %felt_const_2 : !felt.type<"babybear"> + %8 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %9 = scf.for %arg4 = %6 to %7 step %8 iter_args(%arg5 = %arg2) -> (!felt.type<"babybear">) { + %11 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %12 = bool.cmp lt(%11, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%13, %14] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %15, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %arg5, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %17 : !felt.type<"babybear"> + } + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %4:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %2[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %2[%8] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %2[%12] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %13, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %arg3, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %16, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %3#0, %4#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@BinSum_1::@BinSum_1<[]>> + } + function.def @compute(%arg0: !array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c33 = arith.constant 33 : index + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %4 = cast.toindex %felt_const_2 : !felt.type<"babybear"> + %5 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %6 = scf.for %arg4 = %3 to %4 step %5 iter_args(%arg5 = %arg2) -> (!felt.type<"babybear">) { + %8 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %9 = bool.cmp lt(%8, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%10, %11] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %12, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %arg5, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %14 : !felt.type<"babybear"> + } + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + %1:2 = scf.for %arg1 = %c0 to %c33 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %0#0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BinSum_1::@BinSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@BinSum_1::@BinSum_1<[]>>, %arg1: !array.type<2,32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c33 = arith.constant 33 : index + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %felt_const_0 : !felt.type<"babybear"> + %5 = cast.toindex %felt_const_2 : !felt.type<"babybear"> + %6 = cast.toindex %felt_const_1 : !felt.type<"babybear"> + %7 = scf.for %arg5 = %4 to %5 step %6 iter_args(%arg6 = %arg3) -> (!felt.type<"babybear">) { + %9 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %10 = bool.cmp lt(%9, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%11, %12] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %13, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %arg6, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %15 : !felt.type<"babybear"> + } + %8 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + %2:2 = scf.for %arg2 = %c0 to %c33 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%4] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %0[%6] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.sub %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.mul %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%10] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.mul %11, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %14, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %2#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_2 { + struct.def @Bits2Num_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg5, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %13, %12 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + } + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c32 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c32 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @A_3 { + struct.def @A_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2bb : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2bb$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @sum : !struct.type<@BinSum_1::@BinSum_1<[]>> + struct.member @sum$inputs : !pod.type<[@in: !array.type<2,32 x !felt.type<"babybear">>]> + struct.member @b2n : !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + struct.member @b2n$inputs : !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> + struct.member @n2ba : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2ba$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@A_3::@A_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@A_3::@A_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<2,32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_6[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %28 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%28) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %29 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_0[@in] = %arg1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %28 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%28) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %29 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %30[%31] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%c0, %34] = %32 : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %33 : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %36 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %47 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @BinSum_1::@BinSum_1::@product(%47) : (!array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> + %49 = function.call @BinSum_1::@BinSum_1::@compute(%47) : (!array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %48 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %38 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %39[%40] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %42[%c1, %43] = %41 : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %42 : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %45 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %47 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @BinSum_1::@BinSum_1::@compute(%47) : (!array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %48 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %30[%31] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_4[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34] = %32 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %33 : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %36 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %38 = pod.read %pod_4[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @Bits2Num_2::@Bits2Num_2::@product(%38) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> + %40 = function.call @Bits2Num_2::@Bits2Num_2::@compute(%38) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2ba$inputs] = %pod_6 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2ba] = %8 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@b2n$inputs] = %pod_4 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + struct.writem %self[@b2n] = %9 : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + struct.writem %self[@n2bb$inputs] = %pod_0 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bb] = %10 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %pod_2 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,32 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + struct.writem %self[@sum] = %11 : <@A_3::@A_3<[]>>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2bb] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2bb$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %15 = struct.readm %self[@sum] : <@A_3::@A_3<[]>>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@sum$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %self[@b2n] : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@b2n$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %self[@n2ba] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %20 = struct.readm %self[@n2ba$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %21 = pod.read %20[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %19[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %16[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%c0, %33] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %16[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %38[%c1, %39] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %15[@out] : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %18[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %23 = struct.readm %17[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %20[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%19, %24) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %25 = pod.read %18[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_2::@Bits2Num_2::@constrain(%17, %25) : (!struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %26 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %26) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %27 = pod.read %16[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BinSum_1::@BinSum_1::@constrain(%15, %27) : (!struct.type<@BinSum_1::@BinSum_1<[]>>, !array.type<2,32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@A_3::@A_3<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@A_3::@A_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@A_3::@A_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<2,32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_6[@in] = %arg0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %12 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + pod.write %pod_0[@in] = %arg1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%c0, %18] = %16 : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %17 : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %20 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %31 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %32 = function.call @BinSum_1::@BinSum_1::@compute(%31) : (!array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %22 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %23 = struct.readm %22[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %24 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %23[%24] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%c1, %27] = %25 : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %26 : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %29 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %31 = pod.read %pod_2[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "compute"} + %32 = function.call @BinSum_1::@BinSum_1::@compute(%31) : (!array.type<2,32 x !felt.type<"babybear">>) -> !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_4[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@in] = %17 : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_4[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @Bits2Num_2::@Bits2Num_2::@compute(%22) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %23 : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2ba$inputs] = %pod_6 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2ba] = %8 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@b2n$inputs] = %pod_4 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + struct.writem %self[@b2n] = %9 : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "compute"} + struct.writem %self[@n2bb$inputs] = %pod_0 : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2bb] = %10 : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@sum$inputs] = %pod_2 : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,32 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BinSum_1::@BinSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + struct.writem %self[@sum] = %11 : <@A_3::@A_3<[]>>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@A_3::@A_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@A_3::@A_3<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c32 = arith.constant 32 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@A_3::@A_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2bb] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2bb$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@sum] : <@A_3::@A_3<[]>>, !struct.type<@BinSum_1::@BinSum_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@sum$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<2,32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@b2n] : <@A_3::@A_3<[]>>, !struct.type<@Bits2Num_2::@Bits2Num_2<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@b2n$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@n2ba] : <@A_3::@A_3<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@n2ba$inputs] : <@A_3::@A_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %9 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c32 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %4[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%c0, %21] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %4[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%c1, %27] : <2,32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c32 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %3[@out] : <@BinSum_1::@BinSum_1<[]>>, !array.type<33 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <33 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %6[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = struct.readm %5[@out] : <@Bits2Num_2::@Bits2Num_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%7, %12) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %13 = pod.read %6[@in] : <[@in: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_2::@Bits2Num_2::@constrain(%5, %13) : (!struct.type<@Bits2Num_2::@Bits2Num_2<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %14 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %14) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %15 = pod.read %4[@in] : <[@in: !array.type<2,32 x !felt.type<"babybear">>]>, !array.type<2,32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BinSum_1::@BinSum_1::@constrain(%3, %15) : (!struct.type<@BinSum_1::@BinSum_1<[]>>, !array.type<2,32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigadd_15.llzk b/examples/circom-demo/test_bigadd_15.llzk new file mode 100644 index 0000000..c81fe55 --- /dev/null +++ b/examples/circom-demo/test_bigadd_15.llzk @@ -0,0 +1,778 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigAdd_4::@BigAdd_4<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSum_1 { + struct.def @ModSum_1 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_1::@ModSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_1::@ModSum_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %6 = array.read %5[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@ModSum_1::@ModSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_1::@ModSum_1<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSumThree_3 { + struct.def @ModSumThree_3 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_3::@ModSumThree_3<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + %10 = array.read %9[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + function.return %self : !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + %8 = array.read %7[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> + %10 = array.read %9[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%2, %17) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_4 { + struct.def @BigAdd_4 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit : !array.type<4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + struct.member @unit$inputs : !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + struct.member @unit0 : !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<5 x !felt.type<"babybear">>, %arg1: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@BigAdd_4::@BigAdd_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %30 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %30[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %30 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %30 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSum_1::@ModSum_1::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %30 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSum_1::@ModSum_1::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %9 = struct.readm %8[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_0[%34] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@a] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%37] = %35 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %64 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %35[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %35[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %40 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg1[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_0[%47] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@b] = %45 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%50] = %48 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %64 = pod.read %48[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %48[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %48[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %53 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %57 { + %64 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %65 = struct.readm %64[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_0[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %66[@c] = %65 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %66 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %67 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %68 = pod.read %67[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %67[@count] = %69 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %66[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %66[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %66[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%71, %72, %73) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %67[@comp] = %74 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array[%c0] = %67 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %64 = felt.sub %30, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %68 = struct.readm %67[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %69 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_0[%70] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %71[@c] = %68 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%73] = %71 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %74 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array[%75] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %77 = pod.read %76[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.subi %77, %c1 {product_source = "compute"} : index + pod.write %76[@count] = %78 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %79 = arith.cmpi eq, %78, %c0 {product_source = "compute"} : index + scf.if %79 { + %80 = pod.read %71[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = pod.read %71[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %71[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %83 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%80, %81, %82) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %76[@comp] = %83 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %84 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%85] = %76 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %58 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array[%59] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %62 = struct.readm %61[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%63] = %62 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c3] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %12 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_1 : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_0 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %30 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %31 : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = struct.readm %self[@unit] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "constrain"} + %16 = struct.readm %self[@unit$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + %17 = struct.readm %self[@unit0] : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "constrain"} + %18 = struct.readm %self[@unit0$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %17[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %14[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %16[%34] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg1[%37] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %16[%40] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %43 { + %50 = struct.readm %17[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %16[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %52 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %50 = felt.sub %30, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %15[%51] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %53 = struct.readm %52[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %16[%55] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %15[%45] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %14[%48] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %25 = array.read %15[%c3] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %14[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSum_1::@ModSum_1::@constrain(%17, %28, %29) : (!struct.type<@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %30 = array.read %15[%arg2] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %31 = array.read %16[%arg2] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSumThree_3::@ModSumThree_3::@constrain(%30, %32, %33, %34) : (!struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<5 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@BigAdd_4::@BigAdd_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %14 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %14 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSum_1::@ModSum_1::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %14 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSum_1::@ModSum_1::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %9 = struct.readm %8[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_0[%18] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%21] = %19 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %24 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg1[%28] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%31] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%34] = %32 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%36] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %37 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %49 = struct.readm %48[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_0[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %50 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array[%c0] = %51 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %48 = felt.sub %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array[%49] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %52 = struct.readm %51[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_0[%54] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %55[@c] = %52 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%57] = %55 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %58 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array[%59] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.subi %61, %c1 {product_source = "compute"} : index + pod.write %60[@count] = %62 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.cmpi eq, %62, %c0 {product_source = "compute"} : index + scf.if %63 { + %64 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %55[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %60[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %68 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %60 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%43] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%47] = %46 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c3] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %12 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_1 : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_0 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %15 : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<5 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@unit] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@unit$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@unit0] : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %5 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg2[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %3[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c1 to %c5 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg1[%17] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %2[%20] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg2[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %2[%26] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %29 { + %36 = struct.readm %3[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %2[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %36 = felt.sub %16, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %1[%37] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %39 = struct.readm %38[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %2[%41] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %43 = pod.read %42[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %1[%31] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %0[%34] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = array.read %1[%c3] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSum_1::@ModSum_1::@constrain(%3, %14, %15) : (!struct.type<@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %16 = array.read %1[%arg3] : <4 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %17 = array.read %2[%arg3] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSumThree_3::@ModSumThree_3::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigadd_23.llzk b/examples/circom-demo/test_bigadd_23.llzk new file mode 100644 index 0000000..368e39b --- /dev/null +++ b/examples/circom-demo/test_bigadd_23.llzk @@ -0,0 +1,746 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigAdd_4::@BigAdd_4<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSum_1 { + struct.def @ModSum_1 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_1::@ModSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_1::@ModSum_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %6 = array.read %5[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@ModSum_1::@ModSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_1::@ModSum_1<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSumThree_3 { + struct.def @ModSumThree_3 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_3::@ModSumThree_3<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + function.return %self : !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %8 = array.read %7[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%2, %17) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_4 { + struct.def @BigAdd_4 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + struct.member @unit$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigAdd_4::@BigAdd_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %30 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %30[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %30 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %30 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSum_1::@ModSum_1::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %30 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSum_1::@ModSum_1::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %9 = struct.readm %8[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_1[%34] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@a] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%37] = %35 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %64 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %35[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %35[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %40 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg1[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_1[%47] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@b] = %45 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%50] = %48 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %64 = pod.read %48[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %48[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %48[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %53 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %57 { + %64 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %65 = struct.readm %64[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_1[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %66[@c] = %65 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %66 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %67 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %68 = pod.read %67[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %67[@count] = %69 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %66[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %66[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %66[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%71, %72, %73) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %67[@comp] = %74 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array[%c0] = %67 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %64 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %66 = struct.readm %65[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_1[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %67[@c] = %66 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c1] = %67 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %68 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %69 = pod.read %68[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.subi %69, %c1 {product_source = "compute"} : index + pod.write %68[@count] = %70 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %71 = arith.cmpi eq, %70, %c0 {product_source = "compute"} : index + scf.if %71 { + %72 = pod.read %67[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %67[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = pod.read %67[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %75 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%72, %73, %74) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %68[@comp] = %75 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array[%c1] = %68 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %58 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array[%59] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %62 = struct.readm %61[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%63] = %62 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %12 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_1 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %30 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %31 : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = struct.readm %self[@unit0] : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@unit0$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %17 = struct.readm %self[@unit] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "constrain"} + %18 = struct.readm %self[@unit$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %19 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %15[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %14[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %18[%34] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg1[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %18[%40] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %43 { + %50 = struct.readm %15[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %18[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %52 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %50 = array.read %17[%c0] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %18[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %17[%45] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %14[%48] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %25 = array.read %17[%c1] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %26 = struct.readm %25[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %14[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %30 = array.read %17[%arg2] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %31 = array.read %18[%arg2] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSumThree_3::@ModSumThree_3::@constrain(%30, %32, %33, %34) : (!struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %28 = pod.read %16[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %16[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSum_1::@ModSum_1::@constrain(%15, %28, %29) : (!struct.type<@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigAdd_4::@BigAdd_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %14 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSum_1::@ModSum_1::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSum_1::@ModSum_1::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %9 = struct.readm %8[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_1[%18] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%21] = %19 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg1[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_1[%31] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%34] = %32 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%36] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %37 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + %49 = struct.readm %48[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_1[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %50 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array[%c0] = %51 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %48 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %49 = pod.read %48[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %50 = struct.readm %49[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_1[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %51[@c] = %50 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c1] = %51 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %52 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %53 = pod.read %52[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.subi %53, %c1 {product_source = "compute"} : index + pod.write %52[@count] = %54 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.cmpi eq, %54, %c0 {product_source = "compute"} : index + scf.if %55 { + %56 = pod.read %51[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %51[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + pod.write %52[@comp] = %59 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array[%c1] = %52 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%43] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%47] = %46 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %12 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_1 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %15 : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@unit0] : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = struct.readm %arg0[@unit] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@unit$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %5 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c1 to %c3 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg1[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %4[%20] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg2[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %4[%26] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %29 { + %36 = struct.readm %1[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %36 = array.read %3[%c0] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %3[%31] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %0[%34] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = array.read %3[%c1] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = array.read %3[%arg3] : <2 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> {product_source = "constrain"} + %17 = array.read %4[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSumThree_3::@ModSumThree_3::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %14 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSum_1::@ModSum_1::@constrain(%1, %14, %15) : (!struct.type<@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_biglessthan_23.llzk b/examples/circom-demo/test_biglessthan_23.llzk new file mode 100644 index 0000000..cd64a53 --- /dev/null +++ b/examples/circom-demo/test_biglessthan_23.llzk @@ -0,0 +1,1568 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigLessThan_6::@BigLessThan_6<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_0::@Num2Bits_0::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %26 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%13, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsZero_2 { + struct.def @IsZero_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_2::@IsZero_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %11 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %11 : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %11 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %5 = struct.readm %self[@out] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@inv] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %8, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %arg0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@IsZero_2::@IsZero_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_2::@IsZero_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@inv] = %5 : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %felt_const_0 : !felt.type<"babybear"> + } {product_source = "compute"} + %2 = felt.neg %arg0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsZero_2::@IsZero_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_2::@IsZero_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@inv] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.neg %arg1 : !felt.type<"babybear"> {product_source = "constrain"} + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @IsEqual_3 { + struct.def @IsEqual_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_2::@IsZero_2<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @IsZero_2::@IsZero_2::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_2::@IsZero_2<[]>> + %20 = function.call @IsZero_2::@IsZero_2::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_3::@IsEqual_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_3::@IsEqual_3<[]>>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + %9 = struct.readm %self[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %self[@isz] : <@IsEqual_3::@IsEqual_3<[]>>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@isz$inputs] : <@IsEqual_3::@IsEqual_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_2::@IsZero_2::@constrain(%10, %17) : (!struct.type<@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@IsEqual_3::@IsEqual_3<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.subi %3, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.cmpi eq, %4, %c0 {product_source = "compute"} : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = function.call @IsZero_2::@IsZero_2::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %7 : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_3::@IsEqual_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_2::@IsZero_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + struct.writem %self[@isz] = %8 : <@IsEqual_3::@IsEqual_3<[]>>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@IsEqual_3::@IsEqual_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@isz] : <@IsEqual_3::@IsEqual_3<[]>>, !struct.type<@IsZero_2::@IsZero_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_3::@IsEqual_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @IsZero_2::@IsZero_2::@constrain(%1, %8) : (!struct.type<@IsZero_2::@IsZero_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @AND_4 { + struct.def @AND_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@AND_4::@AND_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_4::@AND_4<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_4::@AND_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_4::@AND_4<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OR_5 { + struct.def @OR_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@OR_5::@OR_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_5::@OR_5<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_5::@OR_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_5::@OR_5<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigLessThan_6 { + struct.def @BigLessThan_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @eq_ands : !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> + struct.member @eq_ands$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @lt : !array.type<3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> + struct.member @lt$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @eq : !array.type<3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> + struct.member @eq$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @ors : !array.type<2 x !struct.type<@OR_5::@OR_5<[]>>> + struct.member @ors$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @ands : !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> + struct.member @ands$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_6::@BigLessThan_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigLessThan_6::@BigLessThan_6<[]>> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %18[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = array.read %array_1[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %18[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg2] = %18 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %18[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg2] = %18 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %18[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg2] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %18[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_7[%arg2] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_8 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg0[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_2[%21] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c0] = %20 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_2[%24] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %25[@in] = %23 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%26] = %25 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_1[%27] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %71 = pod.read %25[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %72 = function.call @LessThan_1::@LessThan_1::@product(%71) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + %73 = function.call @LessThan_1::@LessThan_1::@compute(%71) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %28[@comp] = %72 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %74 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%74] = %28 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %32 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %arg1[%32] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_2[%34] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %36[%c1] = %33 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_2[%37] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %38[@in] = %36 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%39] = %38 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_1[%40] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %42 = pod.read %41[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %41[@count] = %43 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %71 = pod.read %38[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %72 = function.call @LessThan_1::@LessThan_1::@compute(%71) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %41[@comp] = %72 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %73 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%73] = %41 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %45 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_4[%47] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %49 = pod.read %48[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %49[%c0] = %46 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_4[%50] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %51[@in] = %49 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %52 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%52] = %51 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %53 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %array_3[%53] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %55 = pod.read %54[@count] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.subi %55, %c1 {product_source = "compute"} : index + pod.write %54[@count] = %56 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.cmpi eq, %56, %c0 {product_source = "compute"} : index + scf.if %57 { + %71 = pod.read %51[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %72 = function.call @IsEqual_3::@IsEqual_3::@product(%71) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> + %73 = function.call @IsEqual_3::@IsEqual_3::@compute(%71) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + pod.write %54[@comp] = %72 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %74 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%74] = %54 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %58 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %arg1[%58] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_4[%60] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %62 = pod.read %61[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %62[%c1] = %59 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %64 = array.read %array_4[%63] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %64[@in] = %62 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %65 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%65] = %64 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %66 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_3[%66] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %68 = pod.read %67[@count] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %67[@count] = %69 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %64[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %72 = function.call @IsEqual_3::@IsEqual_3::@compute(%71) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + pod.write %67[@comp] = %72 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %73 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%73] = %67 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %18 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%18) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %18 = bool.cmp eq(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %18 { + %20 = array.read %array_3[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %22 = struct.readm %21[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@a] = %22 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c1] = %23 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %24 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %68 = pod.read %23[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %23[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %24[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c1] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = array.read %array_1[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %31[@b] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c1] = %31 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %32 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %68 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %32[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c1] = %32 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %36 = array.read %array_3[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_0[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %39[@a] = %38 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %39 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %40 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %68 = pod.read %39[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %40[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c1] = %40 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = array.read %array_3[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_0[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %47[@b] = %46 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %47 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %48 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %68 = pod.read %47[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %48[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c1] = %48 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %52 = array.read %array_1[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %53 = pod.read %52[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %54 = struct.readm %53[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %55[@a] = %54 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c1] = %55 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %56 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %57 = pod.read %56[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %56[@count] = %58 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %68 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @OR_5::@OR_5::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %56[@comp] = %70 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c1] = %56 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %60 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %63[@b] = %62 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c1] = %63 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %64 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %64[@count] = %66 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %68 = pod.read %63[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %63[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @OR_5::@OR_5::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %64[@comp] = %70 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c1] = %64 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %20 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %22 = struct.readm %21[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %array_8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %23[@a] = %22 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c0] = %23 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %24 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %68 = pod.read %23[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %23[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %24[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c0] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = array.read %array_1[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array_8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %31[@b] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c0] = %31 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %32 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %68 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %32[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c0] = %32 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %36 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array_0[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %39[@a] = %38 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %39 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %40 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %68 = pod.read %39[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %40[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c0] = %40 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = array.read %array_3[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_0[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %47[@b] = %46 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %47 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %48 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %68 = pod.read %47[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @AND_4::@AND_4::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %48[@comp] = %70 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c0] = %48 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %52 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %53 = pod.read %52[@comp] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + %54 = struct.readm %53[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %55[@a] = %54 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0] = %55 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %56 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %57 = pod.read %56[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %56[@count] = %58 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %68 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @OR_5::@OR_5::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %56[@comp] = %70 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c0] = %56 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %60 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %63 = array.read %array_6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %63[@b] = %62 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0] = %63 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %64 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %64[@count] = %66 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %68 = pod.read %63[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %69 = pod.read %63[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %70 = function.call @OR_5::@OR_5::@compute(%68, %69) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %64[@comp] = %70 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c0] = %64 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %19 = felt.sub %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %19 : !felt.type<"babybear"> + } + %1 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + %3 = struct.readm %2[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %3 : <@BigLessThan_6::@BigLessThan_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %array_2 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_9 = array.new : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = array.read %array_1[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + array.write %array_9[%arg2] = %19 : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@lt] = %array_9 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> {product_source = "compute"} + struct.writem %self[@ands$inputs] = %array_8 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_10 = array.new : <2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_10[%arg2] = %19 : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@ands] = %array_10 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + struct.writem %self[@ors$inputs] = %array_6 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_11 = array.new : <2 x !struct.type<@OR_5::@OR_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_11[%arg2] = %19 : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@ors] = %array_11 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@OR_5::@OR_5<[]>>> {product_source = "compute"} + struct.writem %self[@eq$inputs] = %array_4 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_12 = array.new : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + array.write %array_12[%arg2] = %19 : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eq] = %array_12 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> {product_source = "compute"} + struct.writem %self[@eq_ands$inputs] = %array_0 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_13 = array.new : <2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_13[%arg2] = %19 : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eq_ands] = %array_13 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@BigLessThan_6::@BigLessThan_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = struct.readm %self[@eq_ands] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "constrain"} + %6 = struct.readm %self[@eq_ands$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %self[@lt] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> {product_source = "constrain"} + %8 = struct.readm %self[@lt$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %9 = struct.readm %self[@eq] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> {product_source = "constrain"} + %10 = struct.readm %self[@eq$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %11 = struct.readm %self[@ors] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@OR_5::@OR_5<[]>>> {product_source = "constrain"} + %12 = struct.readm %self[@ors$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %13 = struct.readm %self[@ands] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "constrain"} + %14 = struct.readm %self[@ands$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %8[%21] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = array.read %23[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg1[%25] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %8[%27] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = pod.read %28[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = array.read %29[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %10[%33] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = pod.read %34[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = array.read %35[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg1[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %10[%39] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = pod.read %40[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = array.read %41[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %15 = scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %18 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%18) {product_source = "constrain"} %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %18 = bool.cmp eq(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %18 { + %20 = array.read %9[%c2] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %14[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %7[%c1] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %25 = struct.readm %24[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %14[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %27 = pod.read %26[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %9[%c2] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %31 = pod.read %30[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %9[%c1] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %35 = pod.read %34[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %7[%c2] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %12[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %13[%c1] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %41 = struct.readm %40[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %12[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %43 = pod.read %42[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %20 = array.read %5[%c1] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %14[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %7[%c0] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %25 = struct.readm %24[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %14[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %27 = pod.read %26[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %5[%c1] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %31 = pod.read %30[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %9[%c0] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %35 = pod.read %34[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %11[%c1] : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %12[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %13[%c0] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %41 = struct.readm %40[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %12[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %43 = pod.read %42[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %41 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %19 = felt.sub %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %19 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %16 = array.read %11[%c0] : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = array.read %7[%arg2] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %19 = array.read %8[%arg2] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%18, %20) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %13[%arg2] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %19 = array.read %14[%arg2] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @AND_4::@AND_4::@constrain(%18, %20, %21) : (!struct.type<@AND_4::@AND_4<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %11[%arg2] : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "constrain"} + %19 = array.read %12[%arg2] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @OR_5::@OR_5::@constrain(%18, %20, %21) : (!struct.type<@OR_5::@OR_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %18 = array.read %9[%arg2] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %19 = array.read %10[%arg2] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %20 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_3::@IsEqual_3::@constrain(%18, %20) : (!struct.type<@IsEqual_3::@IsEqual_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %18 = array.read %5[%arg2] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %19 = array.read %6[%arg2] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %20 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @AND_4::@AND_4::@constrain(%18, %20, %21) : (!struct.type<@AND_4::@AND_4<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@BigLessThan_6::@BigLessThan_6<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigLessThan_6::@BigLessThan_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigLessThan_6::@BigLessThan_6<[]>> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_1[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_1[%arg2] = %4 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_3 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg2] = %4 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_5 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_7[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_8 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array_2[%7] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %9[%c0] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %array_2[%10] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %11[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%12] = %11 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_1[%13] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %14[@count] = %16 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %57 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @LessThan_1::@LessThan_1::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %14[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %59 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%59] = %14 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %18 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg1[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_2[%20] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %22[%c1] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_2[%23] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %24[@in] = %22 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%25] = %24 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %array_1[%26] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %28 = pod.read %27[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %27[@count] = %29 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %57 = pod.read %24[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @LessThan_1::@LessThan_1::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + pod.write %27[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %59 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%59] = %27 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %31 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_4[%33] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = pod.read %34[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %35[%c0] = %32 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_4[%36] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %37[@in] = %35 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%38] = %37 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_3[%39] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %57 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @IsEqual_3::@IsEqual_3::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + pod.write %40[@comp] = %58 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %59 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%59] = %40 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg1[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_4[%46] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %48 = pod.read %47[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %48[%c1] = %45 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_4[%49] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %50[@in] = %48 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%51] = %50 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %52 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array_3[%52] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %57 = pod.read %50[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @IsEqual_3::@IsEqual_3::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + pod.write %53[@comp] = %58 : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %59 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%59] = %53 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %4 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%4) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %4 = bool.cmp eq(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %4 { + %6 = array.read %array_3[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %9[@a] = %8 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c1] = %9 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %10 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %54 = pod.read %9[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %9[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %10[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c1] = %10 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %14 = array.read %array_1[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@b] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c1] = %17 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %18 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %54 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %18[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c1] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %22 = array.read %array_3[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %25[@a] = %24 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %25 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %26 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %54 = pod.read %25[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %26[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c1] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %30 = array.read %array_3[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %33[@b] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c1] = %33 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %34 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %54 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %34[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c1] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = array.read %array_1[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %41[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c1] = %41 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %42 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %54 = pod.read %41[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @OR_5::@OR_5::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %42[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c1] = %42 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %46 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %47 = pod.read %46[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %48 = struct.readm %47[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array_6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %49[@b] = %48 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c1] = %49 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %50 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %49[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %49[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @OR_5::@OR_5::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %50[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c1] = %50 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %6 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %9[@a] = %8 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c0] = %9 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %10 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %54 = pod.read %9[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %9[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %10[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c0] = %10 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %14 = array.read %array_1[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + %16 = struct.readm %15[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@b] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_8[%c0] = %17 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %18 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %54 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %18[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_7[%c0] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %22 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %24 = struct.readm %23[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %25[@a] = %24 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %25 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %26 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %54 = pod.read %25[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %26[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c0] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %30 = array.read %array_3[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + %32 = struct.readm %31[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %array_0[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %33[@b] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%c0] = %33 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %34 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %54 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @AND_4::@AND_4::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + pod.write %34[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array[%c0] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %38 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + %40 = struct.readm %39[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %41[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0] = %41 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %42 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %54 = pod.read %41[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @OR_5::@OR_5::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %42[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c0] = %42 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %46 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %47 = pod.read %46[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + %48 = struct.readm %47[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %array_6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %49[@b] = %48 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%c0] = %49 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %50 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %49[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %49[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = function.call @OR_5::@OR_5::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + pod.write %50[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_5[%c0] = %50 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %5 = felt.sub %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %5 : !felt.type<"babybear"> + } + %1 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + %3 = struct.readm %2[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %3 : <@BigLessThan_6::@BigLessThan_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %array_2 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_9 = array.new : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_1[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + array.write %array_9[%arg2] = %5 : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@lt] = %array_9 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> {product_source = "compute"} + struct.writem %self[@ands$inputs] = %array_8 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_10 = array.new : <2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_10[%arg2] = %5 : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@ands] = %array_10 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + struct.writem %self[@ors$inputs] = %array_6 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_11 = array.new : <2 x !struct.type<@OR_5::@OR_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@OR_5::@OR_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + array.write %array_11[%arg2] = %5 : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@ors] = %array_11 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@OR_5::@OR_5<[]>>> {product_source = "compute"} + struct.writem %self[@eq$inputs] = %array_4 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_12 = array.new : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_3::@IsEqual_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + array.write %array_12[%arg2] = %5 : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eq] = %array_12 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> {product_source = "compute"} + struct.writem %self[@eq_ands$inputs] = %array_0 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "compute"} + %array_13 = array.new : <2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@AND_4::@AND_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + array.write %array_13[%arg2] = %5 : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@eq_ands] = %array_13 : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigLessThan_6::@BigLessThan_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigLessThan_6::@BigLessThan_6<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigLessThan_6::@BigLessThan_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@eq_ands] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@eq_ands$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@lt] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@LessThan_1::@LessThan_1<[]>>> {product_source = "constrain"} + %4 = struct.readm %arg0[@lt$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@eq] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@eq$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@ors] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@OR_5::@OR_5<[]>>> {product_source = "constrain"} + %8 = struct.readm %arg0[@ors$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@ands] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !struct.type<@AND_4::@AND_4<[]>>> {product_source = "constrain"} + %10 = struct.readm %arg0[@ands$inputs] : <@BigLessThan_6::@BigLessThan_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %4[%17] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg2[%21] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %4[%23] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = pod.read %24[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = array.read %25[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg1[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %6[%29] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = pod.read %30[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = array.read %31[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg2[%33] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %6[%35] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = pod.read %36[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = array.read %37[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %14 = bool.cmp ge(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%14) {product_source = "constrain"} %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">): + %14 = bool.cmp eq(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %14 { + %16 = array.read %5[%c2] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %10[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %3[%c1] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %10[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %5[%c2] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %25 = struct.readm %24[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %27 = pod.read %26[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %5[%c1] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %31 = pod.read %30[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %3[%c2] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %35 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %9[%c1] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %16 = array.read %1[%c1] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %17 = struct.readm %16[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %10[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %3[%c0] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %21 = struct.readm %20[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %10[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %1[%c1] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %25 = struct.readm %24[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %27 = pod.read %26[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %5[%c0] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %29 = struct.readm %28[@out] : <@IsEqual_3::@IsEqual_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %31 = pod.read %30[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %7[%c1] : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %35 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %9[%c0] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@out] : <@AND_4::@AND_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %15 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %15 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + %12 = array.read %7[%c0] : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "constrain"} + %13 = struct.readm %12[@out] : <@OR_5::@OR_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = array.read %3[%arg3] : <3 x !struct.type<@LessThan_1::@LessThan_1<[]>>>, !struct.type<@LessThan_1::@LessThan_1<[]>> {product_source = "constrain"} + %15 = array.read %4[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_1::@LessThan_1::@constrain(%14, %16) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %9[%arg3] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %15 = array.read %10[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @AND_4::@AND_4::@constrain(%14, %16, %17) : (!struct.type<@AND_4::@AND_4<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %7[%arg3] : <2 x !struct.type<@OR_5::@OR_5<[]>>>, !struct.type<@OR_5::@OR_5<[]>> {product_source = "constrain"} + %15 = array.read %8[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @OR_5::@OR_5::@constrain(%14, %16, %17) : (!struct.type<@OR_5::@OR_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = array.read %5[%arg3] : <3 x !struct.type<@IsEqual_3::@IsEqual_3<[]>>>, !struct.type<@IsEqual_3::@IsEqual_3<[]>> {product_source = "constrain"} + %15 = array.read %6[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @IsEqual_3::@IsEqual_3::@constrain(%14, %16) : (!struct.type<@IsEqual_3::@IsEqual_3<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %1[%arg3] : <2 x !struct.type<@AND_4::@AND_4<[]>>>, !struct.type<@AND_4::@AND_4<[]>> {product_source = "constrain"} + %15 = array.read %2[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @AND_4::@AND_4::@constrain(%14, %16, %17) : (!struct.type<@AND_4::@AND_4<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigmod_22.llzk b/examples/circom-demo/test_bigmod_22.llzk new file mode 100644 index 0000000..647f898 --- /dev/null +++ b/examples/circom-demo/test_bigmod_22.llzk @@ -0,0 +1,7205 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigMod_16::@BigMod_16<[]>>} { + function.def @SplitThreeFn_0(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.shl %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.uintdiv %arg0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.shl %felt_const_1, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.umod %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c2] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<3 x !felt.type<"babybear">> + } + function.def @SplitFn_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2 x !felt.type<"babybear">> + } + function.def @long_div_2(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c100 = arith.constant 100 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %1 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg3[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + array.write %nondet_1[%8] = %7 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_2 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = scf.while (%arg5 = %arg2) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %5 = bool.cmp ge(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%5) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %5 = bool.cmp eq(%arg5, %arg5) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %17 = cast.toindex %arg1 : !felt.type<"babybear"> + array.write %nondet_3[%17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.while (%arg6 = %18) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %20 = bool.cmp ge(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%20) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %20 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet_1[%21] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet_3[%23] = %22 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %24 : !felt.type<"babybear"> + } + } else { + %17 = scf.while (%arg6 = %arg1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %18 = bool.cmp ge(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%18) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %18 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %nondet_1[%19] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet_3[%21] = %20 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + } + %6 = function.call @short_div_3(%arg0, %arg1, %nondet_3, %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %7 = cast.toindex %arg5 : !felt.type<"babybear"> + array.write %nondet[%c0, %7] = %6 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_4 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %arg5 : !felt.type<"babybear"> + %9 = array.read %nondet[%c0, %8] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = function.call @long_scalar_mult_4(%arg0, %arg1, %9, %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<2 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_5[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + scf.for %arg6 = %c0 to %12 step %c1 { + %17 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet_5[%18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %13 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %17 = bool.cmp le(%arg6, %arg1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %17 = felt.add %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = bool.cmp lt(%17, %18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %19 { + %21 = cast.toindex %arg6 : !felt.type<"babybear"> + %22 = array.read %10[%21] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %23 : !felt.type<"babybear"> + array.write %nondet_5[%24] = %22 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %20 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } + %14 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = function.call @long_sub_5(%arg0, %14, %nondet_1, %nondet_5) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg6 = %c0 to %c100 step %c1 { + %17 = array.read %15[%arg6] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%arg6] = %17 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %16 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %16 : !felt.type<"babybear"> + } + %3 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %3 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + array.write %nondet[%c1, %8] = %7 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %4 = cast.toindex %arg1 : !felt.type<"babybear"> + array.write %nondet[%c1, %4] = %felt_const_0 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2,100 x !felt.type<"babybear">> + } + function.def @short_div_3(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c100 = arith.constant 100 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg3[%2] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.uintdiv %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = function.call @long_scalar_mult_6(%arg0, %6, %5, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c100 step %c1 { + %13 = array.read %7[%arg4] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%arg4] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_0 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = function.call @long_scalar_mult_4(%arg0, %arg1, %5, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<2 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c100 step %c1 { + %13 = array.read %8[%arg4] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%arg4] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %9 = cast.toindex %arg1 : !felt.type<"babybear"> + %10 = array.read %nondet_0[%9] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = bool.cmp ne(%10, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %13 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = function.call @short_div_norm_7(%arg0, %13, %nondet, %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + scf.yield %14 : !felt.type<"babybear"> + } else { + %13 = function.call @short_div_norm_7(%arg0, %arg1, %nondet, %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + scf.yield %13 : !felt.type<"babybear"> + } + function.return %12 : !felt.type<"babybear"> + } + function.def @long_scalar_mult_4(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<2 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg3[%4] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.umod %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.uintdiv %7, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet[%18] = %16 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @long_sub_5(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp ge(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%16] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = bool.cmp ge(%4, %10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %11 { + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %arg3[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %nondet_0[%18] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%21] = %20 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%24] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @long_scalar_mult_6(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg3[%4] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.umod %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.uintdiv %7, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet[%18] = %16 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @short_div_norm_7(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + %1 = array.read %arg2[%0] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg2[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg3[%9] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.uintdiv %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.sub %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = bool.cmp gt(%11, %13) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = scf.if %14 -> (!felt.type<"babybear">) { + %21 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } else { + scf.yield %11 : !felt.type<"babybear"> + } + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = function.call @long_scalar_mult_6(%arg0, %arg1, %15, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %17 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = function.call @long_gt_8(%arg0, %17, %16, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %19 = bool.cmp eq(%18, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = scf.if %19 -> (!felt.type<"babybear">) { + %21 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = function.call @long_sub_9(%arg0, %21, %16, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %23 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = function.call @long_gt_8(%arg0, %23, %22, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %25 = bool.cmp eq(%24, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = scf.if %25 -> (!felt.type<"babybear">) { + %27 = felt.sub %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %27 : !felt.type<"babybear"> + } else { + %27 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %27 : !felt.type<"babybear"> + } + scf.yield %26 : !felt.type<"babybear"> + } else { + scf.yield %15 : !felt.type<"babybear"> + } + function.return %20 : !felt.type<"babybear"> + } + function.def @long_gt_8(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<100 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !felt.type<"babybear"> + %nondet_0 = llzk.nondet : i1 + %0 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1:3 = scf.while (%arg4 = %nondet, %arg5 = %0, %arg6 = %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, i1) -> (!felt.type<"babybear">, !felt.type<"babybear">, i1) { + %3 = bool.cmp ge(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = bool.not %arg6 : i1 + %5 = bool.and %4, %3 : i1, i1 + scf.condition(%5) %arg4, %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } do { + ^bb0(%arg4: !felt.type<"babybear">, %arg5: !felt.type<"babybear">, %arg6: i1): + %3 = cast.toindex %arg5 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %arg5 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp gt(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = arith.select %7, %felt_const_1, %arg4 : !felt.type<"babybear"> + %9:3 = scf.if %7 -> (!felt.type<"babybear">, !felt.type<"babybear">, i1) { + %nondet_1 = llzk.nondet : !felt.type<"babybear"> + scf.yield %8, %nondet_1, %true : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } else { + %10 = cast.toindex %arg5 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %arg5 : !felt.type<"babybear"> + %13 = array.read %arg3[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = bool.cmp lt(%11, %13) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = arith.select %14, %felt_const_0, %8 : !felt.type<"babybear"> + %16 = scf.if %14 -> (!felt.type<"babybear">) { + %nondet_1 = llzk.nondet : !felt.type<"babybear"> + scf.yield %nondet_1 : !felt.type<"babybear"> + } else { + %17 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %17 : !felt.type<"babybear"> + } + scf.yield %15, %16, %14 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } + scf.yield %9#0, %9#1, %9#2 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } + %2 = arith.select %1#2, %1#0, %felt_const_0 : !felt.type<"babybear"> + function.return %2 : !felt.type<"babybear"> + } + function.def @long_sub_9(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<100 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp ge(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%16] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = bool.cmp ge(%4, %10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %11 { + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %arg3[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %nondet_0[%18] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%21] = %20 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%24] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigMultNoCarry_1 { + struct.def @BigMultNoCarry_1 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<5 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LongToShortNoEndCarry_3 { + struct.def @LongToShortNoEndCarry_3 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @runningCarry : !array.type<5 x !felt.type<"babybear">> + struct.member @outRangeChecks : !array.type<6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @outRangeChecks$inputs : !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @runningCarryRangeChecks : !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @runningCarryRangeChecks$inputs : !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c6 = arith.constant 6 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + %array = array.new : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = array.read %array[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1] = %22 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <6 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_2 = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = array.read %array_2[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array_2[%arg1] = %22 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + %array_3 = array.new : <5 x !pod.type<[@in: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %nondet_4 = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet_4[%c0] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c1] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c2] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c3] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c4] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg0[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = function.call @SplitThreeFn_0(%24, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> + %26 = cast.toindex %22 : !felt.type<"babybear"> + array.insert %nondet_4[%26] = %25 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + } + %nondet_6 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = array.read %nondet_4[%c0, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_7 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_7[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_7[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %nondet_4[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %nondet_4[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = function.call @SplitFn_1(%3, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %5 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = array.read %4[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c1] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c2 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %nondet_10 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_10[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_10[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %nondet_4[%23, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %nondet_4[%26, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %24, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = felt.sub %22, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %29 : !felt.type<"babybear"> + %31 = array.read %nondet_4[%30, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %28, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + %35 = array.read %nondet_6[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %32, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = function.call @SplitFn_1(%36, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %38 = array.read %37[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = cast.toindex %22 : !felt.type<"babybear"> + array.write %nondet_0[%39] = %38 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = array.read %37[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = cast.toindex %22 : !felt.type<"babybear"> + array.write %nondet_6[%41] = %40 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = array.read %nondet_4[%c4, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = array.read %nondet_4[%c3, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = array.read %nondet_6[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %nondet_0[%23] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = array.read %array_1[%25] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %26[@in] = %24 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %27 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array_1[%27] = %26 : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %28 = cast.toindex %22 : !felt.type<"babybear"> + %29 = array.read %array[%28] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %26[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %34 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%33) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %29[@comp] = %34 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %35 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array[%35] = %29 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + } + } + %12 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = array.read %nondet_0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.div %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %15 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = array.read %nondet[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %array_3[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %17[@in] = %16 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_3[%c0] = %17 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %18 = array.read %array_2[%c0] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %18[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + array.write %array_2[%c0] = %18 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + scf.for %arg1 = %c1 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg0[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = array.read %nondet_0[%25] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.sub %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %28 : !felt.type<"babybear"> + %30 = array.read %nondet[%29] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.div %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %22 : !felt.type<"babybear"> + array.write %nondet[%33] = %32 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = cast.toindex %22 : !felt.type<"babybear"> + %35 = array.read %nondet[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = cast.toindex %22 : !felt.type<"babybear"> + %37 = array.read %array_3[%36] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %37[@in] = %35 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %38 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array_3[%38] = %37 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %39 = cast.toindex %22 : !felt.type<"babybear"> + %40 = array.read %array_2[%39] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.subi %41, %c1 : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %43 = arith.cmpi eq, %42, %c0 : index + scf.if %43 { + %44 = pod.read %37[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %45 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%44) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %40[@comp] = %45 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %46 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array_2[%46] = %40 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + } + struct.writem %self[@outRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_8 = array.new : <6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = array.read %array[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + array.write %array_8[%arg1] = %23 : <6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + struct.writem %self[@outRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_9 = array.new : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = array.read %array_2[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + array.write %array_9[%arg1] = %23 : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + struct.writem %self[@runningCarryRangeChecks] = %array_9 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.writem %self[@out] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + struct.writem %self[@runningCarry] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c6 = arith.constant 6 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + %3 = struct.readm %arg0[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + %4 = struct.readm %arg0[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + %5 = struct.readm %arg0[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c2] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c3] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c4] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %arg1[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = function.call @SplitThreeFn_0(%23, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> + %25 = cast.toindex %21 : !felt.type<"babybear"> + array.insert %nondet[%25] = %24 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + } + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = array.read %nondet[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %nondet[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = function.call @SplitFn_1(%8, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %10 = array.read %9[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %10 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c2 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %nondet[%22, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %24 : !felt.type<"babybear"> + %26 = array.read %nondet[%25, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %23, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.sub %21, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %28 : !felt.type<"babybear"> + %30 = array.read %nondet[%29, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %32 : !felt.type<"babybear"> + %34 = array.read %nondet_1[%33] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = felt.add %31, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = function.call @SplitFn_1(%35, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %37 = array.read %36[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = cast.toindex %21 : !felt.type<"babybear"> + array.write %nondet_1[%38] = %37 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c6 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %0[%22] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %21 : !felt.type<"babybear"> + %25 = array.read %3[%24] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %11 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %5[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %13 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %1[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %21 : !felt.type<"babybear"> + %25 = array.read %5[%24] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %21 : !felt.type<"babybear"> + %28 = array.read %1[%27] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.mul %28, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %21 : !felt.type<"babybear"> + %31 = array.read %arg1[%30] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %21 : !felt.type<"babybear"> + %33 = array.read %0[%32] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.sub %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %1[%36] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %34, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %29, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %19 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %0[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c6 step %c1 { + %21 = array.read %2[%arg2] : <6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %22 = array.read %3[%arg2] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%21, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %21 = array.read %4[%arg2] : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %22 = array.read %5[%arg2] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%21, %23) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @BigMult_4 { + struct.def @BigMult_4 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @longshort : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.member @longshort$inputs : !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + struct.member @mult : !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.member @mult$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + %pod = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<5 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %6 = cast.toindex %2 : !felt.type<"babybear"> + array.write %5[%6] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %5 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %7 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.subi %7, %c1 : index + pod.write %pod_1[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.cmpi eq, %8, %c0 : index + scf.if %9 { + %17 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %18 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %19 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%17, %18) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg1[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %13 = cast.toindex %2 : !felt.type<"babybear"> + array.write %12[%13] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %12 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %15 = arith.subi %14, %c1 : index + pod.write %pod_1[@count] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.cmpi eq, %15, %c0 : index + scf.if %16 { + %17 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %18 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %19 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%17, %18) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %4 = struct.readm %3[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %4[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %8 = cast.toindex %2 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %7 : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %13 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%12) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + } + scf.for %arg2 = %c0 to %c6 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %4 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %4[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%7] = %6 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@mult$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.writem %self[@mult] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.writem %self[@longshort$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.writem %self[@longshort] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMult_4::@BigMult_4<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %2 = struct.readm %arg0[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %4 = struct.readm %arg0[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %11[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %8 : !felt.type<"babybear"> + %15 = array.read %arg2[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %17 = cast.toindex %8 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c5 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = struct.readm %3[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + %10 = cast.toindex %8 : !felt.type<"babybear"> + %11 = array.read %9[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = pod.read %2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %13 = cast.toindex %8 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c6 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = struct.readm %1[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + %10 = cast.toindex %8 : !felt.type<"babybear"> + %11 = array.read %9[%10] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %0[%12] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %6 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@constrain(%3, %5, %6) : (!struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + %7 = pod.read %2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%1, %7) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_5 { + struct.def @Num2Bits_5 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSum_6 { + struct.def @ModSum_6 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_6::@ModSum_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_6::@ModSum_6<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<3 x !felt.type<"babybear">> + %6 = array.read %5[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_6::@ModSum_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_6::@ModSum_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + function.return %self : !struct.type<@ModSum_6::@ModSum_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_6::@ModSum_6<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_6::@ModSum_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_6::@ModSum_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<3 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%2, %11) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_7 { + struct.def @Num2Bits_7 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSumThree_8 { + struct.def @ModSumThree_8 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_8::@ModSumThree_8<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<4 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_8::@ModSumThree_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_8::@ModSumThree_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + function.return %self : !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_8::@ModSumThree_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_8::@ModSumThree_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<4 x !felt.type<"babybear">> + %8 = array.read %7[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%2, %17) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_9 { + struct.def @BigAdd_9 { + struct.member @out : !array.type<7 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSum_6::@ModSum_6<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + struct.member @unit$inputs : !array.type<5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<6 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<6 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c6 = arith.constant 6 : index + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigAdd_9::@BigAdd_9<[]>> + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %14 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %14 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSum_6::@ModSum_6::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_6::@ModSum_6<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + } + %4 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSum_6::@ModSum_6::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_6::@ModSum_6<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + %9 = struct.readm %8[@sum] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %9 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c6 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg0[%15] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %array_1[%18] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + array.write %array_1[%21] = %19 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %array[%23] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %24 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %array_1[%31] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + array.write %array_1[%34] = %32 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %array[%36] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %37 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + %49 = struct.readm %48[@carry] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %50 = array.read %array_1[%c0] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %50 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %51 = array.read %array[%c0] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.subi %52, %c1 : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %54 = arith.cmpi eq, %53, %c0 : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %58 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array[%c0] = %51 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + } else { + %48 = felt.sub %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = cast.toindex %48 : !felt.type<"babybear"> + %50 = array.read %array[%49] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %52 = struct.readm %51[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %53 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = cast.toindex %53 : !felt.type<"babybear"> + %55 = array.read %array_1[%54] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %55[@c] = %52 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = cast.toindex %56 : !felt.type<"babybear"> + array.write %array_1[%57] = %55 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %58 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = cast.toindex %58 : !felt.type<"babybear"> + %60 = array.read %array[%59] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %61 = pod.read %60[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %62 = arith.subi %61, %c1 : index + pod.write %60[@count] = %62 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %63 = arith.cmpi eq, %62, %c0 : index + scf.if %63 { + %64 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %65 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %66 = pod.read %55[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %67 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %60[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %68 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %68 : !felt.type<"babybear"> + array.write %array[%69] = %60 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %42 : !felt.type<"babybear"> + %44 = array.read %array[%43] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %46 = struct.readm %45[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %47 = cast.toindex %14 : !felt.type<"babybear"> + array.write %nondet[%47] = %46 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %10 = array.read %array[%c4] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + array.write %nondet[%c6] = %12 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@unit$inputs] = %array_1 : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %14 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array_2[%arg2] = %15 : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + } + struct.writem %self[@unit] = %array_2 : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigAdd_9::@BigAdd_9<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + struct.writem %self[@unit0] = %13 : <@BigAdd_9::@BigAdd_9<[]>>, !struct.type<@ModSum_6::@ModSum_6<[]>> + struct.writem %self[@out] = %nondet : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigAdd_9::@BigAdd_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, %arg1: !array.type<6 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<6 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c6 = arith.constant 6 : index + %true = arith.constant true + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@unit0] : <@BigAdd_9::@BigAdd_9<[]>>, !struct.type<@ModSum_6::@ModSum_6<[]>> + %2 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_9::@BigAdd_9<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %3 = struct.readm %arg0[@unit] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + %4 = struct.readm %arg0[@unit$inputs] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %5 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = struct.readm %1[@sum] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %10 = array.read %0[%c0] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c1 to %c6 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%17] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %4[%20] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %16 : !felt.type<"babybear"> + %24 = array.read %arg2[%23] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %4[%26] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %29 { + %36 = struct.readm %1[@carry] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %37 = array.read %4[%c0] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %36 = felt.sub %16, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = cast.toindex %36 : !felt.type<"babybear"> + %38 = array.read %3[%37] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %39 = struct.readm %38[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %40 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %40 : !felt.type<"babybear"> + %42 = array.read %4[%41] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %43 = pod.read %42[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %3[%31] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %33 = struct.readm %32[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %34 = cast.toindex %16 : !felt.type<"babybear"> + %35 = array.read %0[%34] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %11 = array.read %3[%c4] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %13 = array.read %0[%c6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %16 = array.read %3[%arg3] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %17 = array.read %4[%arg3] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSumThree_8::@ModSumThree_8::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + %14 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSum_6::@ModSum_6::@constrain(%1, %14, %15) : (!struct.type<@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @LessThan_10 { + struct.def @LessThan_10 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_10::@LessThan_10<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + function.return %self : !struct.type<@LessThan_10::@LessThan_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_10::@LessThan_10<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%1, %11) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @IsZero_11 { + struct.def @IsZero_11 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_11::@IsZero_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@IsZero_11::@IsZero_11<[]>> + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@inv] = %5 : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + scf.yield %felt_const_0 : !felt.type<"babybear"> + } + %2 = felt.neg %arg0 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %4 : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@IsZero_11::@IsZero_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_11::@IsZero_11<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@inv] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + %2 = felt.neg %arg1 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @IsEqual_12 { + struct.def @IsEqual_12 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_11::@IsZero_11<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_12::@IsEqual_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@IsEqual_12::@IsEqual_12<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.subi %3, %c1 : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.cmpi eq, %4, %c0 : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %10 = function.call @IsZero_11::@IsZero_11::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_11::@IsZero_11<[]>> + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_11::@IsZero_11<[]>> + } + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_11::@IsZero_11<[]>> + %7 = struct.readm %6[@out] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %7 : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_12::@IsEqual_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_11::@IsZero_11<[]>> + struct.writem %self[@isz] = %8 : <@IsEqual_12::@IsEqual_12<[]>>, !struct.type<@IsZero_11::@IsZero_11<[]>> + function.return %self : !struct.type<@IsEqual_12::@IsEqual_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@isz] : <@IsEqual_12::@IsEqual_12<[]>>, !struct.type<@IsZero_11::@IsZero_11<[]>> + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_12::@IsEqual_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %1[@out] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @IsZero_11::@IsZero_11::@constrain(%1, %8) : (!struct.type<@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @AND_13 { + struct.def @AND_13 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@AND_13::@AND_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_13::@AND_13<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_13::@AND_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_13::@AND_13<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OR_14 { + struct.def @OR_14 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@OR_14::@OR_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_14::@OR_14<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_14::@OR_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_14::@OR_14<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigLessThan_15 { + struct.def @BigLessThan_15 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !array.type<2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + struct.member @lt$inputs : !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @ors : !array.type<1 x !struct.type<@OR_14::@OR_14<[]>>> + struct.member @ors$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @ands : !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + struct.member @ands$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @eq_ands : !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + struct.member @eq_ands$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @eq : !array.type<2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + struct.member @eq$inputs : !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigLessThan_15::@BigLessThan_15<[]>> + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %12 : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %array_2 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_3 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%c0] = %1 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %array_4 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_5 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>> + %2 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + array.write %array_5[%c0] = %2 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %array_6 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_7 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + array.write %array_7[%arg2] = %12 : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + } + %array_8 = array.new : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg0[%13] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %12 : !felt.type<"babybear"> + %16 = array.read %array_0[%15] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %17[%c0] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %12 : !felt.type<"babybear"> + %19 = array.read %array_0[%18] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %19[@in] = %17 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_0[%20] = %19 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %21 = cast.toindex %12 : !felt.type<"babybear"> + %22 = array.read %array[%21] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.subi %23, %c1 : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %25 = arith.cmpi eq, %24, %c0 : index + scf.if %25 { + %65 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @LessThan_10::@LessThan_10::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> + pod.write %22[@comp] = %66 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%67] = %22 : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + } + %26 = cast.toindex %12 : !felt.type<"babybear"> + %27 = array.read %arg1[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %12 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %30 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %30[%c1] = %27 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %12 : !felt.type<"babybear"> + %32 = array.read %array_0[%31] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %32[@in] = %30 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %33 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_0[%33] = %32 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %34 = cast.toindex %12 : !felt.type<"babybear"> + %35 = array.read %array[%34] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.subi %36, %c1 : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.cmpi eq, %37, %c0 : index + scf.if %38 { + %65 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @LessThan_10::@LessThan_10::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> + pod.write %35[@comp] = %66 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%67] = %35 : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + } + %39 = cast.toindex %12 : !felt.type<"babybear"> + %40 = array.read %arg0[%39] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = cast.toindex %12 : !felt.type<"babybear"> + %42 = array.read %array_8[%41] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %43 = pod.read %42[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %43[%c0] = %40 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %12 : !felt.type<"babybear"> + %45 = array.read %array_8[%44] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %45[@in] = %43 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %46 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_8[%46] = %45 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %47 = cast.toindex %12 : !felt.type<"babybear"> + %48 = array.read %array_7[%47] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %50 = arith.subi %49, %c1 : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %51 = arith.cmpi eq, %50, %c0 : index + scf.if %51 { + %65 = pod.read %45[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @IsEqual_12::@IsEqual_12::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_12::@IsEqual_12<[]>> + pod.write %48[@comp] = %66 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_7[%67] = %48 : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + } + %52 = cast.toindex %12 : !felt.type<"babybear"> + %53 = array.read %arg1[%52] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = cast.toindex %12 : !felt.type<"babybear"> + %55 = array.read %array_8[%54] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %56 = pod.read %55[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %56[%c1] = %53 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = cast.toindex %12 : !felt.type<"babybear"> + %58 = array.read %array_8[%57] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %58[@in] = %56 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %59 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_8[%59] = %58 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %60 = cast.toindex %12 : !felt.type<"babybear"> + %61 = array.read %array_7[%60] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %63 = arith.subi %62, %c1 : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %64 = arith.cmpi eq, %63, %c0 : index + scf.if %64 { + %65 = pod.read %58[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @IsEqual_12::@IsEqual_12::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_12::@IsEqual_12<[]>> + pod.write %61[@comp] = %66 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_7[%67] = %61 : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + } + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + %12 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %14 = struct.readm %13[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %15 = array.read %array_4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %15[@a] = %14 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c0] = %15 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %60 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %16[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_3[%c0] = %16 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %20 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %22 = struct.readm %21[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %23 = array.read %array_4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %23[@b] = %22 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c0] = %23 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %24 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %60 = pod.read %23[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %23[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %24[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_3[%c0] = %24 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %28 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %30 = struct.readm %29[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %31 = array.read %array_6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %31[@a] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c0] = %31 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %32 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.subi %33, %c1 : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.cmpi eq, %34, %c0 : index + scf.if %35 { + %60 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %32[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_5[%c0] = %32 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %36 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %38 = struct.readm %37[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %39 = array.read %array_6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %39[@b] = %38 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c0] = %39 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %40 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.subi %41, %c1 : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %43 = arith.cmpi eq, %42, %c0 : index + scf.if %43 { + %60 = pod.read %39[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %40[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_5[%c0] = %40 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %44 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %46 = struct.readm %45[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %47 = array.read %array_2[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %47[@a] = %46 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c0] = %47 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %48 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %50 = arith.subi %49, %c1 : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %51 = arith.cmpi eq, %50, %c0 : index + scf.if %51 { + %60 = pod.read %47[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @OR_14::@OR_14::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_14::@OR_14<[]>> + pod.write %48[@comp] = %62 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + array.write %array_1[%c0] = %48 : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + } + %52 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %53 = pod.read %52[@comp] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + %54 = struct.readm %53[@out] : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + %55 = array.read %array_2[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %55[@b] = %54 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c0] = %55 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %56 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %57 = pod.read %56[@count] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %58 = arith.subi %57, %c1 : index + pod.write %56[@count] = %58 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %59 = arith.cmpi eq, %58, %c0 : index + scf.if %59 { + %60 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @OR_14::@OR_14::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_14::@OR_14<[]>> + pod.write %56[@comp] = %62 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + array.write %array_1[%c0] = %56 : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + } + scf.yield %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear"> + } + %3 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + %5 = struct.readm %4[@out] : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> + struct.writem %self[@ors$inputs] = %array_2 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_9 = array.new : <1 x !struct.type<@OR_14::@OR_14<[]>>> + %6 = array.read %array_1[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + array.write %array_9[%c0] = %7 : <1 x !struct.type<@OR_14::@OR_14<[]>>>, !struct.type<@OR_14::@OR_14<[]>> + struct.writem %self[@ors] = %array_9 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@OR_14::@OR_14<[]>>> + struct.writem %self[@lt$inputs] = %array_0 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_10 = array.new : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + array.write %array_10[%arg2] = %13 : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + } + struct.writem %self[@lt] = %array_10 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + struct.writem %self[@ands$inputs] = %array_4 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_11 = array.new : <1 x !struct.type<@AND_13::@AND_13<[]>>> + %8 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_11[%c0] = %9 : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + struct.writem %self[@ands] = %array_11 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + struct.writem %self[@eq$inputs] = %array_8 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_12 = array.new : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + array.write %array_12[%arg2] = %13 : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + } + struct.writem %self[@eq] = %array_12 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + struct.writem %self[@eq_ands$inputs] = %array_6 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_13 = array.new : <1 x !struct.type<@AND_13::@AND_13<[]>>> + %10 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_13[%c0] = %11 : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + struct.writem %self[@eq_ands] = %array_13 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + function.return %self : !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@lt] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + %2 = struct.readm %arg0[@lt$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@ors] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@OR_14::@OR_14<[]>>> + %4 = struct.readm %arg0[@ors$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %5 = struct.readm %arg0[@ands] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + %6 = struct.readm %arg0[@ands$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %7 = struct.readm %arg0[@eq_ands] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + %8 = struct.readm %arg0[@eq_ands$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %9 = struct.readm %arg0[@eq] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + %10 = struct.readm %arg0[@eq$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg1[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %2[%28] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %30 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %31 = array.read %30[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %25 : !felt.type<"babybear"> + %33 = array.read %arg2[%32] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = cast.toindex %25 : !felt.type<"babybear"> + %35 = array.read %2[%34] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %36 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %37 = array.read %36[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %37, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = cast.toindex %25 : !felt.type<"babybear"> + %39 = array.read %arg1[%38] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = cast.toindex %25 : !felt.type<"babybear"> + %41 = array.read %10[%40] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %42 = pod.read %41[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %43 = array.read %42[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %25 : !felt.type<"babybear"> + %45 = array.read %arg2[%44] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = cast.toindex %25 : !felt.type<"babybear"> + %47 = array.read %10[%46] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %48 = pod.read %47[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %49 = array.read %48[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %49, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %25 = bool.cmp ge(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%25) + } do { + %25 = array.read %9[%c1] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %26 = struct.readm %25[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %27 = array.read %6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %1[%c0] : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %30 = struct.readm %29[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %31 = array.read %6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %32 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %9[%c1] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %34 = struct.readm %33[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %35 = array.read %8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %36 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %36, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %9[%c0] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %38 = struct.readm %37[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %39 = array.read %8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %40 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %40, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = array.read %1[%c1] : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %42 = struct.readm %41[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %43 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %44 = pod.read %43[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %5[%c0] : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + %46 = struct.readm %45[@out] : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + %47 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %48 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %48, %46 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear"> + } + %11 = array.read %3[%c0] : <1 x !struct.type<@OR_14::@OR_14<[]>>>, !struct.type<@OR_14::@OR_14<[]>> + %12 = struct.readm %11[@out] : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = array.read %3[%c0] : <1 x !struct.type<@OR_14::@OR_14<[]>>>, !struct.type<@OR_14::@OR_14<[]>> + %14 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %15 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_14::@OR_14::@constrain(%13, %15, %16) : (!struct.type<@OR_14::@OR_14<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + scf.for %arg3 = %c0 to %c2 step %c1 { + %25 = array.read %1[%arg3] : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %26 = array.read %2[%arg3] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_10::@LessThan_10::@constrain(%25, %27) : (!struct.type<@LessThan_10::@LessThan_10<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + %17 = array.read %5[%c0] : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + %18 = array.read %6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_13::@AND_13::@constrain(%17, %19, %20) : (!struct.type<@AND_13::@AND_13<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + scf.for %arg3 = %c0 to %c2 step %c1 { + %25 = array.read %9[%arg3] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %26 = array.read %10[%arg3] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @IsEqual_12::@IsEqual_12::@constrain(%25, %27) : (!struct.type<@IsEqual_12::@IsEqual_12<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + %21 = array.read %7[%c0] : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + %22 = array.read %8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %24 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_13::@AND_13::@constrain(%21, %23, %24) : (!struct.type<@AND_13::@AND_13<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigMod_16 { + struct.def @BigMod_16 { + struct.member @div : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @mod : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @mul : !struct.type<@BigMult_4::@BigMult_4<[]>> + struct.member @mul$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + struct.member @mod_range_checks : !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @mod_range_checks$inputs : !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @div_range_checks : !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @div_range_checks$inputs : !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @add : !struct.type<@BigAdd_9::@BigAdd_9<[]>> + struct.member @add$inputs : !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> + struct.member @lt : !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> + struct.member @lt$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMod_16::@BigMod_16<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c12 = arith.constant {product_source = "compute"} 12 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@BigMod_16::@BigMod_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %79[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %79 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %79 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %79[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg2] = %79 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_5 = pod.new { @count = %c12 } : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_9[%c0] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c1] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + %0 = function.call @long_div_2(%felt_const_2, %felt_const_2, %felt_const_2, %arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %0[%c0, %80] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%82] = %81 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %0[%c1, %83] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%85] = %84 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %0[%c0, %c2] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %79 = bool.cmp le(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%79) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %79 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %nondet[%79] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_4[%81] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %82[@in] = %80 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%83] = %82 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %84 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array_3[%84] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %85[@count] = %87 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %90 = pod.read %82[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %91 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%90) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %85[@comp] = %91 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %92 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%92] = %85 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %89 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %89 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %nondet_0[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %array_2[%82] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %83[@in] = %81 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%84] = %83 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array[%85] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %87 = pod.read %86[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.subi %87, %c1 {product_source = "compute"} : index + pod.write %86[@count] = %88 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %89 = arith.cmpi eq, %88, %c0 {product_source = "compute"} : index + scf.if %89 { + %90 = pod.read %83[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %91 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%90) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %86[@comp] = %91 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %92 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%92] = %86 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %nondet[%80] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %82[%83] = %81 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %82 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %84 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.subi %84, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %85 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.cmpi eq, %85, %c0 {product_source = "compute"} : index + scf.if %86 { + %94 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigMult_4::@BigMult_4::@compute(%94, %95) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %87 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %arg1[%87] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %89[%90] = %88 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %89 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %91 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.subi %91, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %92 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.cmpi eq, %92, %c0 {product_source = "compute"} : index + scf.if %93 { + %94 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigMult_4::@BigMult_4::@compute(%94, %95) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %4[%c2] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %4 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %79 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigMult_4::@BigMult_4::@compute(%79, %80) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %8 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %79 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigMult_4::@BigMult_4::@compute(%79, %80) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %81 = struct.readm %80[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %81[%82] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %84 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %84[%85] = %83 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %84 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %87 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %90 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %91 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %92 = function.call @BigAdd_9::@BigAdd_9::@compute(%90, %91) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %92 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %89 = bool.cmp lt(%79, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %89 { + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %nondet_0[%90] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %92[%93] = %91 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %92 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %94 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %95 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %97 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %98 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %99 = function.call @BigAdd_9::@BigAdd_9::@compute(%97, %98) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %99 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %90 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %90[%91] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %90 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %92 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.subi %92, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %93 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %94 = arith.cmpi eq, %93, %c0 {product_source = "compute"} : index + scf.if %94 { + %95 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %96 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %97 = function.call @BigAdd_9::@BigAdd_9::@compute(%95, %96) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %97 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c4] = %14 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %15 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %79 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %21 = array.read %20[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %22[%c5] = %21 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %22 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %24 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %79 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %26 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %26[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %26 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %28 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %79 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %30 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %30[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %30 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %32 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %79 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %nondet_0[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %82[%83] = %81 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %82 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %84 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.subi %84, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %85 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.cmpi eq, %85, %c0 {product_source = "compute"} : index + scf.if %86 { + %94 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%94, %95) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %87 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %arg1[%87] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %89[%90] = %88 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %89 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %91 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.subi %91, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %92 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.cmpi eq, %92, %c0 {product_source = "compute"} : index + scf.if %93 { + %94 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%94, %95) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_8 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %34 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@mul$inputs] = %pod_1 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@mul] = %35 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@add$inputs] = %pod_6 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@add] = %36 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@div_range_checks$inputs] = %array_4 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_11 = array.new : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %79 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_11[%arg2] = %80 : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@div_range_checks] = %array_11 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@mod_range_checks$inputs] = %array_2 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_12[%arg2] = %80 : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mod_range_checks] = %array_12 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@div] = %nondet : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@mod] = %nondet_0 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = struct.readm %self[@div] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = struct.readm %self[@mod] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = struct.readm %self[@mul] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "constrain"} + %40 = struct.readm %self[@mul$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %self[@mod_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %42 = struct.readm %self[@mod_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %43 = struct.readm %self[@div_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %44 = struct.readm %self[@div_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %45 = struct.readm %self[@add] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "constrain"} + %46 = struct.readm %self[@add$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %self[@lt] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "constrain"} + %48 = struct.readm %self[@lt$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet_13 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_14 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_14[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_13[%c0] = %nondet_14 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_13[%c1] = %nondet_14 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = function.call @long_div_2(%felt_const_2, %felt_const_2, %felt_const_2, %arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %79 = bool.cmp le(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%79) {product_source = "constrain"} %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %79 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %80 = array.read %37[%79] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = array.read %44[%81] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %83 = pod.read %82[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %84 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %84 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %38[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = array.read %42[%82] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %84 = pod.read %83[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %37[%80] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = pod.read %40[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %82[%83] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %86 = array.read %arg1[%85] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %87 = pod.read %40[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %87[%88] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %51 = array.read %37[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %40[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = array.read %52[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = pod.read %40[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = array.read %54[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = struct.readm %39[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = array.read %80[%81] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %83 = pod.read %46[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %85 = array.read %83[%84] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %85, %82 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %86 = bool.cmp lt(%79, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %86 { + %87 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %88 = array.read %38[%87] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %89 = pod.read %46[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %91 = array.read %89[%90] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %91, %88 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %87 = pod.read %46[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %87[%88] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %56 = struct.readm %39[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = array.read %56[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %46[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = array.read %58[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = struct.readm %39[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = array.read %60[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %46[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = array.read %62[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %46[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = array.read %64[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = pod.read %46[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = array.read %66[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = struct.readm %45[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = array.read %80[%81] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %arg0[%83] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %82, %84 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %68 = struct.readm %45[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = array.read %68[%c4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %69, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = struct.readm %45[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = array.read %70[%c5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %38[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = pod.read %48[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %82[%83] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %86 = array.read %arg1[%85] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %87 = pod.read %48[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %87[%88] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %72 = struct.readm %47[@out] : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %72, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %48[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %48[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigLessThan_15::@BigLessThan_15::@constrain(%47, %73, %74) : (!struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %40[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %40[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMult_4::@BigMult_4::@constrain(%39, %75, %76) : (!struct.type<@BigMult_4::@BigMult_4<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %77 = pod.read %46[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %46[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigAdd_9::@BigAdd_9::@constrain(%45, %77, %78) : (!struct.type<@BigAdd_9::@BigAdd_9<[]>>, !array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %79 = array.read %43[%arg2] : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %80 = array.read %44[%arg2] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %81 = pod.read %80[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%79, %81) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = array.read %41[%arg2] : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %80 = array.read %42[%arg2] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %81 = pod.read %80[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%79, %81) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@BigMod_16::@BigMod_16<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMod_16::@BigMod_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c12 = arith.constant {product_source = "compute"} 12 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@BigMod_16::@BigMod_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %37[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %37 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_2 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_3 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %37 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %37[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_3[%arg2] = %37 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_5 = pod.new { @count = %c12 } : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_9[%c0] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c1] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + %0 = function.call @long_div_2(%felt_const_2, %felt_const_2, %felt_const_2, %arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %0[%c0, %38] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%40] = %39 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %0[%c1, %41] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%43] = %42 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %0[%c0, %c2] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %37 = bool.cmp le(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%37) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %37 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %nondet[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_4[%39] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %40[@in] = %38 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%41] = %40 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %42 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array_3[%42] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %43[@count] = %45 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %48 = pod.read %40[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%48) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %43[@comp] = %49 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %50 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%50] = %43 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %47 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %47 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet_0[%38] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_2[%40] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %41[@in] = %39 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%42] = %41 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%43] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %41[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%48) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %44[@comp] = %49 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %50 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%50] = %44 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet[%38] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %40 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %43 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %52 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigMult_4::@BigMult_4::@compute(%52, %53) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg1[%45] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %47 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %50 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigMult_4::@BigMult_4::@compute(%52, %53) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %4[%c2] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %4 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %37 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigMult_4::@BigMult_4::@compute(%37, %38) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %8 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %37 = pod.read %pod_1[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_1[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigMult_4::@BigMult_4::@compute(%37, %38) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %39[%40] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %42[%43] = %41 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %42 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %45 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %48 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %50 = function.call @BigAdd_9::@BigAdd_9::@compute(%48, %49) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %50 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %47 = bool.cmp lt(%37, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %47 { + %48 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %nondet_0[%48] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %50[%51] = %49 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %50 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %53 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %55 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %57 = function.call @BigAdd_9::@BigAdd_9::@compute(%55, %56) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %57 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %48 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %48 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %51 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @BigAdd_9::@BigAdd_9::@compute(%53, %54) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c4] = %14 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %15 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %37 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %21 = array.read %20[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %22[%c5] = %21 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %22 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %24 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %37 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %26 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %26[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %26 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %28 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %37 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %30 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %30[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %30 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %32 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %37 = pod.read %pod_6[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_6[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet_0[%38] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %40 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %43 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %52 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%52, %53) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg1[%45] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %47 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %50 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%52, %53) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_8 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %34 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@mul$inputs] = %pod_1 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@mul] = %35 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@add$inputs] = %pod_6 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@add] = %36 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@div_range_checks$inputs] = %array_4 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_11 = array.new : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %37 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_11[%arg2] = %38 : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@div_range_checks] = %array_11 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@mod_range_checks$inputs] = %array_2 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_12[%arg2] = %38 : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mod_range_checks] = %array_12 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@div] = %nondet : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@mod] = %nondet_0 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigMod_16::@BigMod_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMod_16::@BigMod_16<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %true = arith.constant true + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@div] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@mod] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@mul] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@mul$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@mod_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@mod_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@div_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %7 = struct.readm %arg0[@div_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@add] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "constrain"} + %9 = struct.readm %arg0[@add$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = struct.readm %arg0[@lt] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "constrain"} + %11 = struct.readm %arg0[@lt$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c1] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = function.call @long_div_2(%felt_const_2, %felt_const_2, %felt_const_2, %arg1, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %42 = bool.cmp le(%arg3, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%42) {product_source = "constrain"} %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">): + %42 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %0[%42] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %7[%44] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %47 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %5[%45] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %47 = pod.read %46[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %0[%43] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %3[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg2[%48] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = pod.read %3[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = array.read %0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %3[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %3[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = struct.readm %2[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %9[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %46[%47] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = bool.cmp lt(%42, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %49 { + %50 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %1[%50] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %9[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %50 = pod.read %9[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %19 = struct.readm %2[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %9[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %2[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = array.read %23[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %9[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = array.read %25[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %9[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = array.read %27[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %9[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = array.read %29[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = struct.readm %8[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %arg1[%46] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %31 = struct.readm %8[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = array.read %31[%c4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = struct.readm %8[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = array.read %33[%c5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %11[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg2[%48] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = pod.read %11[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %35 = struct.readm %10[@out] : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = pod.read %11[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %11[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigLessThan_15::@BigLessThan_15::@constrain(%10, %36, %37) : (!struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %38 = pod.read %3[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = pod.read %3[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMult_4::@BigMult_4::@constrain(%2, %38, %39) : (!struct.type<@BigMult_4::@BigMult_4<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %40 = pod.read %9[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = pod.read %9[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigAdd_9::@BigAdd_9::@constrain(%8, %40, %41) : (!struct.type<@BigAdd_9::@BigAdd_9<[]>>, !array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %42 = array.read %6[%arg3] : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %43 = array.read %7[%arg3] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%42, %44) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = array.read %4[%arg3] : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %43 = array.read %5[%arg3] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%42, %44) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigmod_32.llzk b/examples/circom-demo/test_bigmod_32.llzk new file mode 100644 index 0000000..de853cc --- /dev/null +++ b/examples/circom-demo/test_bigmod_32.llzk @@ -0,0 +1,7210 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigMod_16::@BigMod_16<[]>>} { + function.def @SplitThreeFn_0(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.shl %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.uintdiv %arg0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.shl %felt_const_1, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.umod %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c2] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<3 x !felt.type<"babybear">> + } + function.def @SplitFn_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2 x !felt.type<"babybear">> + } + function.def @long_div_2(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<4 x !felt.type<"babybear">>, %arg4: !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c100 = arith.constant 100 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %1 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg3[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + array.write %nondet_1[%8] = %7 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_2 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = scf.while (%arg5 = %arg2) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %5 = bool.cmp ge(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%5) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %5 = bool.cmp eq(%arg5, %arg5) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %17 = cast.toindex %arg1 : !felt.type<"babybear"> + array.write %nondet_3[%17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.while (%arg6 = %18) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %20 = bool.cmp ge(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%20) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %20 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet_1[%21] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet_3[%23] = %22 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %24 : !felt.type<"babybear"> + } + } else { + %17 = scf.while (%arg6 = %arg1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %18 = bool.cmp ge(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%18) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %18 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %nondet_1[%19] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet_3[%21] = %20 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + } + %6 = function.call @short_div_3(%arg0, %arg1, %nondet_3, %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %7 = cast.toindex %arg5 : !felt.type<"babybear"> + array.write %nondet[%c0, %7] = %6 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_4 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %arg5 : !felt.type<"babybear"> + %9 = array.read %nondet[%c0, %8] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = function.call @long_scalar_mult_4(%arg0, %arg1, %9, %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<2 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_5[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + scf.for %arg6 = %c0 to %12 step %c1 { + %17 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet_5[%18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %13 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %17 = bool.cmp le(%arg6, %arg1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %17 = felt.add %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = bool.cmp lt(%17, %18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %19 { + %21 = cast.toindex %arg6 : !felt.type<"babybear"> + %22 = array.read %10[%21] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %23 : !felt.type<"babybear"> + array.write %nondet_5[%24] = %22 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %20 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } + %14 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = function.call @long_sub_5(%arg0, %14, %nondet_1, %nondet_5) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg6 = %c0 to %c100 step %c1 { + %17 = array.read %15[%arg6] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%arg6] = %17 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %16 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %16 : !felt.type<"babybear"> + } + %3 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %3 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + array.write %nondet[%c1, %8] = %7 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %4 = cast.toindex %arg1 : !felt.type<"babybear"> + array.write %nondet[%c1, %4] = %felt_const_0 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2,100 x !felt.type<"babybear">> + } + function.def @short_div_3(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<2 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c100 = arith.constant 100 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg3[%2] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.uintdiv %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = function.call @long_scalar_mult_6(%arg0, %6, %5, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c100 step %c1 { + %13 = array.read %7[%arg4] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%arg4] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_0 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = function.call @long_scalar_mult_4(%arg0, %arg1, %5, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<2 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c100 step %c1 { + %13 = array.read %8[%arg4] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%arg4] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %9 = cast.toindex %arg1 : !felt.type<"babybear"> + %10 = array.read %nondet_0[%9] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = bool.cmp ne(%10, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %13 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = function.call @short_div_norm_7(%arg0, %13, %nondet, %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + scf.yield %14 : !felt.type<"babybear"> + } else { + %13 = function.call @short_div_norm_7(%arg0, %arg1, %nondet, %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + scf.yield %13 : !felt.type<"babybear"> + } + function.return %12 : !felt.type<"babybear"> + } + function.def @long_scalar_mult_4(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<2 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg3[%4] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.umod %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.uintdiv %7, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet[%18] = %16 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @long_sub_5(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp ge(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%16] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = bool.cmp ge(%4, %10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %11 { + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %arg3[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %nondet_0[%18] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%21] = %20 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%24] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @long_scalar_mult_6(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg3[%4] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.umod %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.uintdiv %7, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet[%18] = %16 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @short_div_norm_7(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + %1 = array.read %arg2[%0] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg2[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg3[%9] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.uintdiv %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.sub %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = bool.cmp gt(%11, %13) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = scf.if %14 -> (!felt.type<"babybear">) { + %21 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } else { + scf.yield %11 : !felt.type<"babybear"> + } + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = function.call @long_scalar_mult_6(%arg0, %arg1, %15, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %17 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = function.call @long_gt_8(%arg0, %17, %16, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %19 = bool.cmp eq(%18, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = scf.if %19 -> (!felt.type<"babybear">) { + %21 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = function.call @long_sub_9(%arg0, %21, %16, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %23 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = function.call @long_gt_8(%arg0, %23, %22, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %25 = bool.cmp eq(%24, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = scf.if %25 -> (!felt.type<"babybear">) { + %27 = felt.sub %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %27 : !felt.type<"babybear"> + } else { + %27 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %27 : !felt.type<"babybear"> + } + scf.yield %26 : !felt.type<"babybear"> + } else { + scf.yield %15 : !felt.type<"babybear"> + } + function.return %20 : !felt.type<"babybear"> + } + function.def @long_gt_8(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<100 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !felt.type<"babybear"> + %nondet_0 = llzk.nondet : i1 + %0 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1:3 = scf.while (%arg4 = %0, %arg5 = %nondet, %arg6 = %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, i1) -> (!felt.type<"babybear">, !felt.type<"babybear">, i1) { + %3 = bool.cmp ge(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = bool.not %arg6 : i1 + %5 = bool.and %4, %3 : i1, i1 + scf.condition(%5) %arg4, %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } do { + ^bb0(%arg4: !felt.type<"babybear">, %arg5: !felt.type<"babybear">, %arg6: i1): + %3 = cast.toindex %arg4 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %arg4 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp gt(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = arith.select %7, %felt_const_1, %arg5 : !felt.type<"babybear"> + %9:3 = scf.if %7 -> (!felt.type<"babybear">, !felt.type<"babybear">, i1) { + %nondet_1 = llzk.nondet : !felt.type<"babybear"> + scf.yield %nondet_1, %8, %true : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } else { + %10 = cast.toindex %arg4 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %arg4 : !felt.type<"babybear"> + %13 = array.read %arg3[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = bool.cmp lt(%11, %13) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = arith.select %14, %felt_const_0, %8 : !felt.type<"babybear"> + %16 = scf.if %14 -> (!felt.type<"babybear">) { + %nondet_1 = llzk.nondet : !felt.type<"babybear"> + scf.yield %nondet_1 : !felt.type<"babybear"> + } else { + %17 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %17 : !felt.type<"babybear"> + } + scf.yield %16, %15, %14 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } + scf.yield %9#0, %9#1, %9#2 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } + %2 = arith.select %1#2, %1#1, %felt_const_0 : !felt.type<"babybear"> + function.return %2 : !felt.type<"babybear"> + } + function.def @long_sub_9(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<100 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp ge(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%16] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = bool.cmp ge(%4, %10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %11 { + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %arg3[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %nondet_0[%18] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%21] = %20 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%24] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigMultNoCarry_1 { + struct.def @BigMultNoCarry_1 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c6 = arith.constant 6 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c6 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<6 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c6 = arith.constant 6 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<6 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c6 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LongToShortNoEndCarry_3 { + struct.def @LongToShortNoEndCarry_3 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @runningCarry : !array.type<5 x !felt.type<"babybear">> + struct.member @runningCarryRangeChecks : !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @runningCarryRangeChecks$inputs : !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @outRangeChecks : !array.type<6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @outRangeChecks$inputs : !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %c6 = arith.constant 6 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg1] = %22 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <5 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_2 = array.new : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = array.read %array_2[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + array.write %array_2[%arg1] = %22 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + } + %array_3 = array.new : <6 x !pod.type<[@in: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %nondet_4 = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet_4[%c0] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c1] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c2] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c3] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet_4[%c4] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg0[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = function.call @SplitThreeFn_0(%24, %felt_const_3, %felt_const_3, %felt_const_3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> + %26 = cast.toindex %22 : !felt.type<"babybear"> + array.insert %nondet_4[%26] = %25 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + } + %nondet_6 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = array.read %nondet_4[%c0, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_7 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_7[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_7[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %nondet_4[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %nondet_4[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = function.call @SplitFn_1(%3, %felt_const_3, %felt_const_3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = array.read %4[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c1] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c2 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %nondet_10 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_10[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_10[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %nondet_4[%23, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %nondet_4[%26, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %24, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = felt.sub %22, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %29 : !felt.type<"babybear"> + %31 = array.read %nondet_4[%30, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.add %28, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + %35 = array.read %nondet_6[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %32, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = function.call @SplitFn_1(%36, %felt_const_3, %felt_const_3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %38 = array.read %37[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = cast.toindex %22 : !felt.type<"babybear"> + array.write %nondet[%39] = %38 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = array.read %37[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = cast.toindex %22 : !felt.type<"babybear"> + array.write %nondet_6[%41] = %40 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = array.read %nondet_4[%c4, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = array.read %nondet_4[%c3, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = array.read %nondet_6[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c5] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %nondet[%23] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = array.read %array_3[%25] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %26[@in] = %24 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %27 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array_3[%27] = %26 : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %28 = cast.toindex %22 : !felt.type<"babybear"> + %29 = array.read %array_2[%28] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %33 = pod.read %26[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %34 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%33) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %29[@comp] = %34 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %35 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array_2[%35] = %29 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + } + } + %12 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = array.read %nondet[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.div %14, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %15 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = array.read %nondet_0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %array_1[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %17[@in] = %16 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %17 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %18 = array.read %array[%c0] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %22 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %18[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + array.write %array[%c0] = %18 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + scf.for %arg1 = %c1 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %arg0[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = cast.toindex %22 : !felt.type<"babybear"> + %26 = array.read %nondet[%25] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.sub %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %28 : !felt.type<"babybear"> + %30 = array.read %nondet_0[%29] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.div %31, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %22 : !felt.type<"babybear"> + array.write %nondet_0[%33] = %32 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = cast.toindex %22 : !felt.type<"babybear"> + %35 = array.read %nondet_0[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = cast.toindex %22 : !felt.type<"babybear"> + %37 = array.read %array_1[%36] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + pod.write %37[@in] = %35 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %38 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array_1[%38] = %37 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %39 = cast.toindex %22 : !felt.type<"babybear"> + %40 = array.read %array[%39] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.subi %41, %c1 : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %43 = arith.cmpi eq, %42, %c0 : index + scf.if %43 { + %44 = pod.read %37[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %45 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%44) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %40[@comp] = %45 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %46 = cast.toindex %22 : !felt.type<"babybear"> + array.write %array[%46] = %40 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + } + } + struct.writem %self[@outRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_8 = array.new : <6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = array.read %array_2[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + array.write %array_8[%arg1] = %23 : <6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + struct.writem %self[@outRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + %array_9 = array.new : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + array.write %array_9[%arg1] = %23 : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + struct.writem %self[@runningCarryRangeChecks] = %array_9 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.writem %self[@out] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + struct.writem %self[@runningCarry] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c6 = arith.constant 6 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + %3 = struct.readm %arg0[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + %4 = struct.readm %arg0[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + %5 = struct.readm %arg0[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c2] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c3] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + array.insert %nondet[%c4] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %arg1[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = function.call @SplitThreeFn_0(%23, %felt_const_3, %felt_const_3, %felt_const_3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> + %25 = cast.toindex %21 : !felt.type<"babybear"> + array.insert %nondet[%25] = %24 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> + } + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = array.read %nondet[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %nondet[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = function.call @SplitFn_1(%8, %felt_const_3, %felt_const_3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %10 = array.read %9[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %10 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c2 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %nondet[%22, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %24 : !felt.type<"babybear"> + %26 = array.read %nondet[%25, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %23, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.sub %21, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = cast.toindex %28 : !felt.type<"babybear"> + %30 = array.read %nondet[%29, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %32 : !felt.type<"babybear"> + %34 = array.read %nondet_1[%33] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = felt.add %31, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = function.call @SplitFn_1(%35, %felt_const_3, %felt_const_3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> + %37 = array.read %36[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = cast.toindex %21 : !felt.type<"babybear"> + array.write %nondet_1[%38] = %37 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c6 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %0[%22] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %21 : !felt.type<"babybear"> + %25 = array.read %5[%24] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %11 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %3[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %13 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %22 = cast.toindex %21 : !felt.type<"babybear"> + %23 = array.read %1[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %21 : !felt.type<"babybear"> + %25 = array.read %3[%24] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %21 : !felt.type<"babybear"> + %28 = array.read %1[%27] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = felt.mul %28, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = cast.toindex %21 : !felt.type<"babybear"> + %31 = array.read %arg1[%30] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = cast.toindex %21 : !felt.type<"babybear"> + %33 = array.read %0[%32] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.sub %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %1[%36] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %34, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %29, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %19 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %0[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c6 step %c1 { + %21 = array.read %4[%arg2] : <6 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %22 = array.read %5[%arg2] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%21, %23) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %21 = array.read %2[%arg2] : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %22 = array.read %3[%arg2] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%21, %23) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @BigMult_4 { + struct.def @BigMult_4 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @mult : !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.member @mult$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + struct.member @longshort : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.member @longshort$inputs : !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !array.type<5 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %6 = cast.toindex %2 : !felt.type<"babybear"> + array.write %5[%6] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %5 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.subi %7, %c1 : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.cmpi eq, %8, %c0 : index + scf.if %9 { + %17 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %18 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %19 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%17, %18) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg1[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %13 = cast.toindex %2 : !felt.type<"babybear"> + array.write %12[%13] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %12 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %15 = arith.subi %14, %c1 : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.cmpi eq, %15, %c0 : index + scf.if %16 { + %17 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %18 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %19 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%17, %18) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %4 = struct.readm %3[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %4[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %8 = cast.toindex %2 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %7 : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %13 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%12) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + pod.write %pod_1[@comp] = %13 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + } + scf.for %arg2 = %c0 to %c6 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %4 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %4[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %2 : !felt.type<"babybear"> + array.write %nondet[%7] = %6 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@longshort$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.writem %self[@mult$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMult_4::@BigMult_4<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %2 = struct.readm %arg0[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %4 = struct.readm %arg0[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %11[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = cast.toindex %8 : !felt.type<"babybear"> + %15 = array.read %arg2[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %17 = cast.toindex %8 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c5 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = struct.readm %1[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<5 x !felt.type<"babybear">> + %10 = cast.toindex %8 : !felt.type<"babybear"> + %11 = array.read %9[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = pod.read %4[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + %13 = cast.toindex %8 : !felt.type<"babybear"> + %14 = array.read %12[%13] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %14, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c6 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> + %10 = cast.toindex %8 : !felt.type<"babybear"> + %11 = array.read %9[%10] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %0[%12] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = pod.read %4[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%3, %5) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () + %6 = pod.read %2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %7 = pod.read %2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@constrain(%1, %6, %7) : (!struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_5 { + struct.def @Num2Bits_5 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSum_6 { + struct.def @ModSum_6 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_6::@ModSum_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_6::@ModSum_6<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<4 x !felt.type<"babybear">> + %6 = array.read %5[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_6::@ModSum_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_6::@ModSum_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + function.return %self : !struct.type<@ModSum_6::@ModSum_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_6::@ModSum_6<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_6::@ModSum_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_6::@ModSum_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<4 x !felt.type<"babybear">> + %7 = array.read %6[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%2, %11) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_7 { + struct.def @Num2Bits_7 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<5 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSumThree_8 { + struct.def @ModSumThree_8 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_8::@ModSumThree_8<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<5 x !felt.type<"babybear">> + %7 = array.read %6[%c3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<5 x !felt.type<"babybear">> + %10 = array.read %9[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_8::@ModSumThree_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_8::@ModSumThree_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + function.return %self : !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_8::@ModSumThree_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_8::@ModSumThree_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<5 x !felt.type<"babybear">> + %8 = array.read %7[%c3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<5 x !felt.type<"babybear">> + %10 = array.read %9[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%2, %17) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_9 { + struct.def @BigAdd_9 { + struct.member @out : !array.type<7 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit : !array.type<5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + struct.member @unit$inputs : !array.type<5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + struct.member @unit0 : !struct.type<@ModSum_6::@ModSum_6<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<6 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<6 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c6 = arith.constant 6 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %self = struct.new : <@BigAdd_9::@BigAdd_9<[]>> + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %14 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %14 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]> + %pod_1 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_1[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSum_6::@ModSum_6::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_6::@ModSum_6<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + } + %4 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_1[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSum_6::@ModSum_6::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_6::@ModSum_6<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + %9 = struct.readm %8[@sum] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %9 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c6 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg0[%15] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %array_0[%18] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + array.write %array_0[%21] = %19 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %array[%23] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %24 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %array_0[%31] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + array.write %array_0[%34] = %32 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %array[%36] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %37 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + %49 = struct.readm %48[@carry] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %50 = array.read %array_0[%c0] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %50 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %51 = array.read %array[%c0] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.subi %52, %c1 : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %54 = arith.cmpi eq, %53, %c0 : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %58 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array[%c0] = %51 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + } else { + %48 = felt.sub %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = cast.toindex %48 : !felt.type<"babybear"> + %50 = array.read %array[%49] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %52 = struct.readm %51[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %53 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = cast.toindex %53 : !felt.type<"babybear"> + %55 = array.read %array_0[%54] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %55[@c] = %52 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = cast.toindex %56 : !felt.type<"babybear"> + array.write %array_0[%57] = %55 : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %58 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = cast.toindex %58 : !felt.type<"babybear"> + %60 = array.read %array[%59] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %61 = pod.read %60[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %62 = arith.subi %61, %c1 : index + pod.write %60[@count] = %62 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %63 = arith.cmpi eq, %62, %c0 : index + scf.if %63 { + %64 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %65 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %66 = pod.read %55[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %67 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %60[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %68 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = cast.toindex %68 : !felt.type<"babybear"> + array.write %array[%69] = %60 : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %42 : !felt.type<"babybear"> + %44 = array.read %array[%43] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %46 = struct.readm %45[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %47 = cast.toindex %14 : !felt.type<"babybear"> + array.write %nondet[%47] = %46 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %10 = array.read %array[%c4] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + array.write %nondet[%c6] = %12 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@unit0$inputs] = %pod_1 : <@BigAdd_9::@BigAdd_9<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_6::@ModSum_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_6::@ModSum_6<[]>> + struct.writem %self[@unit0] = %13 : <@BigAdd_9::@BigAdd_9<[]>>, !struct.type<@ModSum_6::@ModSum_6<[]>> + struct.writem %self[@unit$inputs] = %array_0 : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + scf.for %arg2 = %c0 to %c5 step %c1 { + %14 = array.read %array[%arg2] : <5 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array_2[%arg2] = %15 : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + } + struct.writem %self[@unit] = %array_2 : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + struct.writem %self[@out] = %nondet : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigAdd_9::@BigAdd_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, %arg1: !array.type<6 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<6 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c6 = arith.constant 6 : index + %true = arith.constant true + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c5 = arith.constant 5 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@unit] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + %2 = struct.readm %arg0[@unit$inputs] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %3 = struct.readm %arg0[@unit0] : <@BigAdd_9::@BigAdd_9<[]>>, !struct.type<@ModSum_6::@ModSum_6<[]>> + %4 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_9::@BigAdd_9<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %5 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = struct.readm %3[@sum] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %10 = array.read %0[%c0] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c1 to %c6 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%17] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %2[%20] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %16 : !felt.type<"babybear"> + %24 = array.read %arg2[%23] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %2[%26] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %29 { + %36 = struct.readm %3[@carry] : <@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear"> + %37 = array.read %2[%c0] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %36 = felt.sub %16, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = cast.toindex %36 : !felt.type<"babybear"> + %38 = array.read %1[%37] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %39 = struct.readm %38[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %40 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = cast.toindex %40 : !felt.type<"babybear"> + %42 = array.read %2[%41] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %43 = pod.read %42[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %1[%31] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %33 = struct.readm %32[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %34 = cast.toindex %16 : !felt.type<"babybear"> + %35 = array.read %0[%34] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %11 = array.read %1[%c4] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %13 = array.read %0[%c6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSum_6::@ModSum_6::@constrain(%3, %14, %15) : (!struct.type<@ModSum_6::@ModSum_6<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + scf.for %arg3 = %c0 to %c5 step %c1 { + %16 = array.read %1[%arg3] : <5 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %17 = array.read %2[%arg3] : <5 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSumThree_8::@ModSumThree_8::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @LessThan_10 { + struct.def @LessThan_10 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_10::@LessThan_10<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + function.return %self : !struct.type<@LessThan_10::@LessThan_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_10::@LessThan_10<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_10::@LessThan_10<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_10::@LessThan_10<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%1, %11) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @IsZero_11 { + struct.def @IsZero_11 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_11::@IsZero_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@IsZero_11::@IsZero_11<[]>> + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@inv] = %5 : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + scf.yield %felt_const_0 : !felt.type<"babybear"> + } + %2 = felt.neg %arg0 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %4 : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@IsZero_11::@IsZero_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_11::@IsZero_11<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@inv] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + %2 = felt.neg %arg1 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @IsEqual_12 { + struct.def @IsEqual_12 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_11::@IsZero_11<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_12::@IsEqual_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@IsEqual_12::@IsEqual_12<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.subi %3, %c1 : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.cmpi eq, %4, %c0 : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %10 = function.call @IsZero_11::@IsZero_11::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_11::@IsZero_11<[]>> + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_11::@IsZero_11<[]>> + } + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_11::@IsZero_11<[]>> + %7 = struct.readm %6[@out] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %7 : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_12::@IsEqual_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_11::@IsZero_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_11::@IsZero_11<[]>> + struct.writem %self[@isz] = %8 : <@IsEqual_12::@IsEqual_12<[]>>, !struct.type<@IsZero_11::@IsZero_11<[]>> + function.return %self : !struct.type<@IsEqual_12::@IsEqual_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@isz] : <@IsEqual_12::@IsEqual_12<[]>>, !struct.type<@IsZero_11::@IsZero_11<[]>> + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_12::@IsEqual_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %1[@out] : <@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @IsZero_11::@IsZero_11::@constrain(%1, %8) : (!struct.type<@IsZero_11::@IsZero_11<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @AND_13 { + struct.def @AND_13 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@AND_13::@AND_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_13::@AND_13<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_13::@AND_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_13::@AND_13<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OR_14 { + struct.def @OR_14 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@OR_14::@OR_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_14::@OR_14<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_14::@OR_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_14::@OR_14<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigLessThan_15 { + struct.def @BigLessThan_15 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !array.type<2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + struct.member @lt$inputs : !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @eq : !array.type<2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + struct.member @eq$inputs : !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @ors : !array.type<1 x !struct.type<@OR_14::@OR_14<[]>>> + struct.member @ors$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @ands : !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + struct.member @ands$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @eq_ands : !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + struct.member @eq_ands$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigLessThan_15::@BigLessThan_15<[]>> + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %12 : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array_1[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + pod.write %12[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg2] = %12 : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + } + %array_2 = array.new : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_3 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %array_4 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_5 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>> + %1 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + pod.write %1[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + array.write %array_5[%c0] = %1 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %array_6 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_7 = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>> + %2 = array.read %array_7[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + pod.write %2[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + array.write %array_7[%c0] = %2 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %array_8 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %arg0[%13] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = cast.toindex %12 : !felt.type<"babybear"> + %16 = array.read %array_0[%15] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %17 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %17[%c0] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %12 : !felt.type<"babybear"> + %19 = array.read %array_0[%18] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %19[@in] = %17 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_0[%20] = %19 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %21 = cast.toindex %12 : !felt.type<"babybear"> + %22 = array.read %array[%21] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.subi %23, %c1 : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %25 = arith.cmpi eq, %24, %c0 : index + scf.if %25 { + %65 = pod.read %19[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @LessThan_10::@LessThan_10::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> + pod.write %22[@comp] = %66 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%67] = %22 : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + } + %26 = cast.toindex %12 : !felt.type<"babybear"> + %27 = array.read %arg1[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %12 : !felt.type<"babybear"> + %29 = array.read %array_0[%28] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %30 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %30[%c1] = %27 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %12 : !felt.type<"babybear"> + %32 = array.read %array_0[%31] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %32[@in] = %30 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %33 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_0[%33] = %32 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %34 = cast.toindex %12 : !felt.type<"babybear"> + %35 = array.read %array[%34] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.subi %36, %c1 : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.cmpi eq, %37, %c0 : index + scf.if %38 { + %65 = pod.read %32[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @LessThan_10::@LessThan_10::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_10::@LessThan_10<[]>> + pod.write %35[@comp] = %66 : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array[%67] = %35 : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + } + %39 = cast.toindex %12 : !felt.type<"babybear"> + %40 = array.read %arg0[%39] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = cast.toindex %12 : !felt.type<"babybear"> + %42 = array.read %array_2[%41] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %43 = pod.read %42[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %43[%c0] = %40 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = cast.toindex %12 : !felt.type<"babybear"> + %45 = array.read %array_2[%44] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %45[@in] = %43 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %46 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_2[%46] = %45 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %47 = cast.toindex %12 : !felt.type<"babybear"> + %48 = array.read %array_1[%47] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %50 = arith.subi %49, %c1 : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %51 = arith.cmpi eq, %50, %c0 : index + scf.if %51 { + %65 = pod.read %45[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @IsEqual_12::@IsEqual_12::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_12::@IsEqual_12<[]>> + pod.write %48[@comp] = %66 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_1[%67] = %48 : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + } + %52 = cast.toindex %12 : !felt.type<"babybear"> + %53 = array.read %arg1[%52] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = cast.toindex %12 : !felt.type<"babybear"> + %55 = array.read %array_2[%54] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %56 = pod.read %55[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %56[%c1] = %53 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = cast.toindex %12 : !felt.type<"babybear"> + %58 = array.read %array_2[%57] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %58[@in] = %56 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %59 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_2[%59] = %58 : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %60 = cast.toindex %12 : !felt.type<"babybear"> + %61 = array.read %array_1[%60] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %63 = arith.subi %62, %c1 : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, index + %64 = arith.cmpi eq, %63, %c0 : index + scf.if %64 { + %65 = pod.read %58[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %66 = function.call @IsEqual_12::@IsEqual_12::@compute(%65) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_12::@IsEqual_12<[]>> + pod.write %61[@comp] = %66 : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %67 = cast.toindex %12 : !felt.type<"babybear"> + array.write %array_1[%67] = %61 : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + } + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %12 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%12) + } do { + %12 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %14 = struct.readm %13[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %15 = array.read %array_6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %15[@a] = %14 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c0] = %15 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %60 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %16[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_5[%c0] = %16 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %20 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %21 = pod.read %20[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %22 = struct.readm %21[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %23 = array.read %array_6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %23[@b] = %22 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c0] = %23 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %24 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %60 = pod.read %23[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %23[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %24[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_5[%c0] = %24 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %28 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %30 = struct.readm %29[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %31 = array.read %array_8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %31[@a] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_8[%c0] = %31 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %32 = array.read %array_7[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.subi %33, %c1 : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.cmpi eq, %34, %c0 : index + scf.if %35 { + %60 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %32[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_7[%c0] = %32 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %36 = array.read %array_1[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %38 = struct.readm %37[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %39 = array.read %array_8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %39[@b] = %38 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_8[%c0] = %39 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %40 = array.read %array_7[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.subi %41, %c1 : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, index + %43 = arith.cmpi eq, %42, %c0 : index + scf.if %43 { + %60 = pod.read %39[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @AND_13::@AND_13::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_13::@AND_13<[]>> + pod.write %40[@comp] = %62 : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_7[%c0] = %40 : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + } + %44 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %46 = struct.readm %45[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %47 = array.read %array_4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %47[@a] = %46 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c0] = %47 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %48 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %49 = pod.read %48[@count] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %50 = arith.subi %49, %c1 : index + pod.write %48[@count] = %50 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %51 = arith.cmpi eq, %50, %c0 : index + scf.if %51 { + %60 = pod.read %47[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @OR_14::@OR_14::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_14::@OR_14<[]>> + pod.write %48[@comp] = %62 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + array.write %array_3[%c0] = %48 : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + } + %52 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %53 = pod.read %52[@comp] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + %54 = struct.readm %53[@out] : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + %55 = array.read %array_4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %55[@b] = %54 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c0] = %55 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %56 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %57 = pod.read %56[@count] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %58 = arith.subi %57, %c1 : index + pod.write %56[@count] = %58 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, index + %59 = arith.cmpi eq, %58, %c0 : index + scf.if %59 { + %60 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %61 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %62 = function.call @OR_14::@OR_14::@compute(%60, %61) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_14::@OR_14<[]>> + pod.write %56[@comp] = %62 : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + array.write %array_3[%c0] = %56 : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + } + scf.yield %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear"> + } + %3 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + %5 = struct.readm %4[@out] : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> + struct.writem %self[@eq$inputs] = %array_2 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_9 = array.new : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array_1[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_12::@IsEqual_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + array.write %array_9[%arg2] = %13 : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + } + struct.writem %self[@eq] = %array_9 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + struct.writem %self[@ors$inputs] = %array_4 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_10 = array.new : <1 x !struct.type<@OR_14::@OR_14<[]>>> + %6 = array.read %array_3[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@OR_14::@OR_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_14::@OR_14<[]>> + array.write %array_10[%c0] = %7 : <1 x !struct.type<@OR_14::@OR_14<[]>>>, !struct.type<@OR_14::@OR_14<[]>> + struct.writem %self[@ors] = %array_10 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@OR_14::@OR_14<[]>>> + struct.writem %self[@ands$inputs] = %array_6 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_11 = array.new : <1 x !struct.type<@AND_13::@AND_13<[]>>> + %8 = array.read %array_5[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_11[%c0] = %9 : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + struct.writem %self[@ands] = %array_11 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + struct.writem %self[@lt$inputs] = %array_0 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_12 = array.new : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %12 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]> + %13 = pod.read %12[@comp] : <[@count: index, @comp: !struct.type<@LessThan_10::@LessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_10::@LessThan_10<[]>> + array.write %array_12[%arg2] = %13 : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + } + struct.writem %self[@lt] = %array_12 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + struct.writem %self[@eq_ands$inputs] = %array_8 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_13 = array.new : <1 x !struct.type<@AND_13::@AND_13<[]>>> + %10 = array.read %array_7[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@AND_13::@AND_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_13::@AND_13<[]>> + array.write %array_13[%c0] = %11 : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + struct.writem %self[@eq_ands] = %array_13 : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + function.return %self : !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@lt] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@LessThan_10::@LessThan_10<[]>>> + %2 = struct.readm %arg0[@lt$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@eq] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>> + %4 = struct.readm %arg0[@eq$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %5 = struct.readm %arg0[@ors] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@OR_14::@OR_14<[]>>> + %6 = struct.readm %arg0[@ors$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %7 = struct.readm %arg0[@ands] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + %8 = struct.readm %arg0[@ands$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %9 = struct.readm %arg0[@eq_ands] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !struct.type<@AND_13::@AND_13<[]>>> + %10 = struct.readm %arg0[@eq_ands$inputs] : <@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg1[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %2[%28] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %30 = pod.read %29[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %31 = array.read %30[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %25 : !felt.type<"babybear"> + %33 = array.read %arg2[%32] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = cast.toindex %25 : !felt.type<"babybear"> + %35 = array.read %2[%34] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %36 = pod.read %35[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %37 = array.read %36[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %37, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %38 = cast.toindex %25 : !felt.type<"babybear"> + %39 = array.read %arg1[%38] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = cast.toindex %25 : !felt.type<"babybear"> + %41 = array.read %4[%40] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %42 = pod.read %41[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %43 = array.read %42[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %44 = cast.toindex %25 : !felt.type<"babybear"> + %45 = array.read %arg2[%44] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = cast.toindex %25 : !felt.type<"babybear"> + %47 = array.read %4[%46] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %48 = pod.read %47[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %49 = array.read %48[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %49, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %25 = bool.cmp ge(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%25) + } do { + %25 = array.read %3[%c1] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %26 = struct.readm %25[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %27 = array.read %8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %28 = pod.read %27[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %1[%c0] : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %30 = struct.readm %29[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %31 = array.read %8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %32 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %3[%c1] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %34 = struct.readm %33[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %35 = array.read %10[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %36 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %36, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %3[%c0] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %38 = struct.readm %37[@out] : <@IsEqual_12::@IsEqual_12<[]>>, !felt.type<"babybear"> + %39 = array.read %10[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %40 = pod.read %39[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %40, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = array.read %1[%c1] : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %42 = struct.readm %41[@out] : <@LessThan_10::@LessThan_10<[]>>, !felt.type<"babybear"> + %43 = array.read %6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %44 = pod.read %43[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %44, %42 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %7[%c0] : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + %46 = struct.readm %45[@out] : <@AND_13::@AND_13<[]>>, !felt.type<"babybear"> + %47 = array.read %6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %48 = pod.read %47[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %48, %46 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear"> + } + %11 = array.read %5[%c0] : <1 x !struct.type<@OR_14::@OR_14<[]>>>, !struct.type<@OR_14::@OR_14<[]>> + %12 = struct.readm %11[@out] : <@OR_14::@OR_14<[]>>, !felt.type<"babybear"> + constrain.eq %0, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %25 = array.read %3[%arg3] : <2 x !struct.type<@IsEqual_12::@IsEqual_12<[]>>>, !struct.type<@IsEqual_12::@IsEqual_12<[]>> + %26 = array.read %4[%arg3] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @IsEqual_12::@IsEqual_12::@constrain(%25, %27) : (!struct.type<@IsEqual_12::@IsEqual_12<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + %13 = array.read %5[%c0] : <1 x !struct.type<@OR_14::@OR_14<[]>>>, !struct.type<@OR_14::@OR_14<[]>> + %14 = array.read %6[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %15 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_14::@OR_14::@constrain(%13, %15, %16) : (!struct.type<@OR_14::@OR_14<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + %17 = array.read %7[%c0] : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + %18 = array.read %8[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_13::@AND_13::@constrain(%17, %19, %20) : (!struct.type<@AND_13::@AND_13<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + scf.for %arg3 = %c0 to %c2 step %c1 { + %25 = array.read %1[%arg3] : <2 x !struct.type<@LessThan_10::@LessThan_10<[]>>>, !struct.type<@LessThan_10::@LessThan_10<[]>> + %26 = array.read %2[%arg3] : <2 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %27 = pod.read %26[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_10::@LessThan_10::@constrain(%25, %27) : (!struct.type<@LessThan_10::@LessThan_10<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + %21 = array.read %9[%c0] : <1 x !struct.type<@AND_13::@AND_13<[]>>>, !struct.type<@AND_13::@AND_13<[]>> + %22 = array.read %10[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %24 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_13::@AND_13::@constrain(%21, %23, %24) : (!struct.type<@AND_13::@AND_13<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigMod_16 { + struct.def @BigMod_16 { + struct.member @div : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @mod : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @div_range_checks : !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @div_range_checks$inputs : !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @mul : !struct.type<@BigMult_4::@BigMult_4<[]>> + struct.member @mul$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + struct.member @add : !struct.type<@BigAdd_9::@BigAdd_9<[]>> + struct.member @add$inputs : !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> + struct.member @mod_range_checks : !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> + struct.member @mod_range_checks$inputs : !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @lt : !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> + struct.member @lt$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMod_16::@BigMod_16<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c12 = arith.constant {product_source = "compute"} 12 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@BigMod_16::@BigMod_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %79 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %79[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %79 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c12 } : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_5 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %79[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg2] = %79 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_7 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_9[%c0] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c1] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + %0 = function.call @long_div_2(%felt_const_3, %felt_const_2, %felt_const_2, %arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %0[%c0, %80] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%82] = %81 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %84 = array.read %0[%c1, %83] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%85] = %84 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %0[%c0, %c2] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %79 = bool.cmp le(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%79) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %79 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %nondet_0[%79] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %81 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %array_1[%81] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %82[@in] = %80 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %83 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%83] = %82 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %84 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %85 = array.read %array[%84] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %86 = pod.read %85[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %85[@count] = %87 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %90 = pod.read %82[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %91 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%90) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %85[@comp] = %91 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %92 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%92] = %85 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %89 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %89 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %nondet[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %array_6[%82] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %83[@in] = %81 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %84 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%84] = %83 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %86 = array.read %array_5[%85] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %87 = pod.read %86[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.subi %87, %c1 {product_source = "compute"} : index + pod.write %86[@count] = %88 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %89 = arith.cmpi eq, %88, %c0 {product_source = "compute"} : index + scf.if %89 { + %90 = pod.read %83[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %91 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%90) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %86[@comp] = %91 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %92 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%92] = %86 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %nondet_0[%80] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %82[%83] = %81 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %82 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %84 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.subi %84, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %85 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.cmpi eq, %85, %c0 {product_source = "compute"} : index + scf.if %86 { + %94 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigMult_4::@BigMult_4::@compute(%94, %95) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %87 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %arg1[%87] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %89[%90] = %88 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %89 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %91 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.subi %91, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %92 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.cmpi eq, %92, %c0 {product_source = "compute"} : index + scf.if %93 { + %94 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigMult_4::@BigMult_4::@compute(%94, %95) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = array.read %nondet_0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %4[%c2] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %4 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %79 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigMult_4::@BigMult_4::@compute(%79, %80) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %8 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %79 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigMult_4::@BigMult_4::@compute(%79, %80) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %81 = struct.readm %80[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %83 = array.read %81[%82] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %84 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %84[%85] = %83 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %84 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %86 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.subi %86, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %87 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %88 = arith.cmpi eq, %87, %c0 {product_source = "compute"} : index + scf.if %88 { + %90 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %91 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %92 = function.call @BigAdd_9::@BigAdd_9::@compute(%90, %91) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %92 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %89 = bool.cmp lt(%79, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %89 { + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %91 = array.read %nondet[%90] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %92 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %93 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %92[%93] = %91 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %92 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %94 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %95 = arith.subi %94, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %95 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %96 = arith.cmpi eq, %95, %c0 {product_source = "compute"} : index + scf.if %96 { + %97 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %98 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %99 = function.call @BigAdd_9::@BigAdd_9::@compute(%97, %98) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %99 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %90 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %91 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %90[%91] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %90 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %92 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.subi %92, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %93 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %94 = arith.cmpi eq, %93, %c0 {product_source = "compute"} : index + scf.if %94 { + %95 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %96 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %97 = function.call @BigAdd_9::@BigAdd_9::@compute(%95, %96) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %97 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c4] = %14 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %15 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %17 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %79 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %21 = array.read %20[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %22[%c5] = %21 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %22 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %24 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %79 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %26 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %26[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %26 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %28 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %79 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %30 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %30[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %30 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %32 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %79 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @BigAdd_9::@BigAdd_9::@compute(%79, %80) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %81 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %81 = array.read %nondet[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %82[%83] = %81 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %82 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %84 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.subi %84, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %85 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.cmpi eq, %85, %c0 {product_source = "compute"} : index + scf.if %86 { + %94 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%94, %95) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %87 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + %88 = array.read %arg1[%87] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %89 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "compute"} + array.write %89[%90] = %88 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %89 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %91 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %92 = arith.subi %91, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %92 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %93 = arith.cmpi eq, %92, %c0 {product_source = "compute"} : index + scf.if %93 { + %94 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %95 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %96 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%94, %95) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %96 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul$inputs] = %pod_2 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@mul] = %34 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@div_range_checks$inputs] = %array_1 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_11 = array.new : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %79 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_11[%arg2] = %80 : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@div_range_checks] = %array_11 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@mod_range_checks$inputs] = %array_6 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %80 = pod.read %79[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_12[%arg2] = %80 : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mod_range_checks] = %array_12 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_8 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %35 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@add$inputs] = %pod_4 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@add] = %36 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@div] = %nondet_0 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@mod] = %nondet : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = struct.readm %self[@div] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %38 = struct.readm %self[@mod] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = struct.readm %self[@div_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %40 = struct.readm %self[@div_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %41 = struct.readm %self[@mul] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "constrain"} + %42 = struct.readm %self[@mul$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %self[@add] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "constrain"} + %44 = struct.readm %self[@add$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %self[@mod_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %46 = struct.readm %self[@mod_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %47 = struct.readm %self[@lt] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "constrain"} + %48 = struct.readm %self[@lt$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet_13 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_14 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_14[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_13[%c0] = %nondet_14 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_13[%c1] = %nondet_14 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = function.call @long_div_2(%felt_const_3, %felt_const_2, %felt_const_2, %arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %50 = scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %79 = bool.cmp le(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%79) {product_source = "constrain"} %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %79 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %80 = array.read %37[%79] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = array.read %40[%81] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %83 = pod.read %82[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %84 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %84 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %38[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = array.read %46[%82] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %84 = pod.read %83[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %37[%80] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = pod.read %42[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %82[%83] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %86 = array.read %arg1[%85] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %87 = pod.read %42[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %87[%88] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %51 = array.read %37[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %42[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = array.read %52[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = pod.read %42[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = array.read %54[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = struct.readm %41[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = array.read %80[%81] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %83 = pod.read %44[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %85 = array.read %83[%84] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %85, %82 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %86 = bool.cmp lt(%79, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %86 { + %87 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %88 = array.read %38[%87] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %89 = pod.read %44[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %91 = array.read %89[%90] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %91, %88 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %87 = pod.read %44[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %87[%88] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %56 = struct.readm %41[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = array.read %56[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %58 = pod.read %44[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = array.read %58[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %59, %57 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %60 = struct.readm %41[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = array.read %60[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %44[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = array.read %62[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %61 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %44[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = array.read %64[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = pod.read %44[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %67 = array.read %66[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %67, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = struct.readm %43[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %82 = array.read %80[%81] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %arg0[%83] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %82, %84 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %68 = struct.readm %43[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %69 = array.read %68[%c4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %69, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %70 = struct.readm %43[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = array.read %70[%c5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %80 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %38[%80] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = pod.read %48[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %82[%83] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %85 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %86 = array.read %arg1[%85] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %87 = pod.read %48[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = cast.toindex %79 : !felt.type<"babybear"> {product_source = "constrain"} + %89 = array.read %87[%88] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %89, %86 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %72 = struct.readm %47[@out] : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %72, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %42[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %42[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMult_4::@BigMult_4::@constrain(%41, %73, %74) : (!struct.type<@BigMult_4::@BigMult_4<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %79 = array.read %39[%arg2] : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %80 = array.read %40[%arg2] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %81 = pod.read %80[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%79, %81) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %79 = array.read %45[%arg2] : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %80 = array.read %46[%arg2] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %81 = pod.read %80[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%79, %81) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %75 = pod.read %48[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %76 = pod.read %48[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigLessThan_15::@BigLessThan_15::@constrain(%47, %75, %76) : (!struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %77 = pod.read %44[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %78 = pod.read %44[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigAdd_9::@BigAdd_9::@constrain(%43, %77, %78) : (!struct.type<@BigAdd_9::@BigAdd_9<[]>>, !array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigMod_16::@BigMod_16<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMod_16::@BigMod_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c12 = arith.constant {product_source = "compute"} 12 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@BigMod_16::@BigMod_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %37 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %37[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %37 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c12 } : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %array_5 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %37[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_5[%arg2] = %37 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_6 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod_7 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_9 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_9[%c0] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_9[%c1] = %nondet_10 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + %0 = function.call @long_div_2(%felt_const_3, %felt_const_2, %felt_const_2, %arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %0[%c0, %38] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%40] = %39 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %0[%c1, %41] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%43] = %42 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %1 = array.read %0[%c0, %c2] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %37 = bool.cmp le(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%37) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %37 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %nondet_0[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_1[%39] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %40[@in] = %38 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%41] = %40 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %42 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %array[%42] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %43[@count] = %45 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %48 = pod.read %40[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%48) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %43[@comp] = %49 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %50 = cast.toindex %arg2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%50] = %43 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %47 = felt.add %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %47 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet[%38] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_6[%40] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %41[@in] = %39 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %42 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_6[%42] = %41 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array_5[%43] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.subi %45, %c1 {product_source = "compute"} : index + pod.write %44[@count] = %46 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %47 = arith.cmpi eq, %46, %c0 {product_source = "compute"} : index + scf.if %47 { + %48 = pod.read %41[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%48) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %44[@comp] = %49 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %50 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_5[%50] = %44 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet_0[%38] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %40 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %43 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %52 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigMult_4::@BigMult_4::@compute(%52, %53) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg1[%45] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %47 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %50 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigMult_4::@BigMult_4::@compute(%52, %53) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = array.read %nondet_0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %4[%c2] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %4 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %37 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigMult_4::@BigMult_4::@compute(%37, %38) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %8 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %37 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigMult_4::@BigMult_4::@compute(%37, %38) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %39 = struct.readm %38[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %39[%40] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %42 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %43 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %42[%43] = %41 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %42 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.subi %44, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %45 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %46 = arith.cmpi eq, %45, %c0 {product_source = "compute"} : index + scf.if %46 { + %48 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %50 = function.call @BigAdd_9::@BigAdd_9::@compute(%48, %49) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %50 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %47 = bool.cmp lt(%37, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %47 { + %48 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %49 = array.read %nondet[%48] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %51 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %50[%51] = %49 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %50 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %52 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %53 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %55 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %57 = function.call @BigAdd_9::@BigAdd_9::@compute(%55, %56) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %57 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %48 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %48 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %51 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @BigAdd_9::@BigAdd_9::@compute(%53, %54) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %55 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c4] = %14 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %15 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %17 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %37 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %21 = array.read %20[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %22[%c5] = %21 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %22 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %24 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %37 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %26 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %26[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %26 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %27 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.subi %27, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %28 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.cmpi eq, %28, %c0 {product_source = "compute"} : index + scf.if %29 { + %37 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %30 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + array.write %30[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %30 : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.subi %31, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %32 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.cmpi eq, %32, %c0 {product_source = "compute"} : index + scf.if %33 { + %37 = pod.read %pod_4[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = pod.read %pod_4[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @BigAdd_9::@BigAdd_9::@compute(%37, %38) : (!array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %nondet[%38] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %40 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %43 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %52 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%52, %53) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg1[%45] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %37 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %47 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %50 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @BigLessThan_15::@BigLessThan_15::@compute(%52, %53) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %54 : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mul$inputs] = %pod_2 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMult_4::@BigMult_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@mul] = %34 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + struct.writem %self[@div_range_checks$inputs] = %array_1 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_11 = array.new : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %37 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_11[%arg2] = %38 : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@div_range_checks] = %array_11 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@mod_range_checks$inputs] = %array_6 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_12 = array.new : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %37 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + array.write %array_12[%arg2] = %38 : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@mod_range_checks] = %array_12 : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_8 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %35 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %35 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "compute"} + struct.writem %self[@add$inputs] = %pod_4 : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %36 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@add] = %36 : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@div] = %nondet_0 : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@mod] = %nondet : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigMod_16::@BigMod_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMod_16::@BigMod_16<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %true = arith.constant true + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@div] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@mod] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@div_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@div_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@mul] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigMult_4::@BigMult_4<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@mul$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@add] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@add$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]> {product_source = "constrain"} + %8 = struct.readm %arg0[@mod_range_checks] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>> {product_source = "constrain"} + %9 = struct.readm %arg0[@mod_range_checks$inputs] : <@BigMod_16::@BigMod_16<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@lt] : <@BigMod_16::@BigMod_16<[]>>, !struct.type<@BigLessThan_15::@BigLessThan_15<[]>> {product_source = "constrain"} + %11 = struct.readm %arg0[@lt$inputs] : <@BigMod_16::@BigMod_16<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c1] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = function.call @long_div_2(%felt_const_3, %felt_const_2, %felt_const_2, %arg1, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %42 = bool.cmp le(%arg3, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%42) {product_source = "constrain"} %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">): + %42 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %0[%42] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %3[%44] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %46 = pod.read %45[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %46, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %47 : !felt.type<"babybear"> + } attributes {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %9[%45] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %47 = pod.read %46[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %0[%43] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %5[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg2[%48] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = pod.read %5[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %14 = array.read %0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %5[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %5[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = struct.readm %4[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %7[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %46[%47] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = bool.cmp lt(%42, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %49 { + %50 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %1[%50] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %7[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %53 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %52[%53] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %54, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %50 = pod.read %7[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %19 = struct.readm %4[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %7[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = struct.readm %4[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = array.read %23[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %7[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = array.read %25[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %7[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = array.read %27[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %7[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = array.read %29[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = struct.readm %6[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %43[%44] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %arg1[%46] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %31 = struct.readm %6[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = array.read %31[%c4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = struct.readm %6[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %34 = array.read %33[%c5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %1[%43] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = pod.read %11[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %46 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %45[%46] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg2[%48] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = pod.read %11[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %50[%51] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %35 = struct.readm %10[@out] : <@BigLessThan_15::@BigLessThan_15<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = pod.read %5[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = pod.read %5[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMult_4::@BigMult_4::@constrain(%4, %36, %37) : (!struct.type<@BigMult_4::@BigMult_4<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %42 = array.read %2[%arg3] : <3 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %43 = array.read %3[%arg3] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%42, %44) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %42 = array.read %8[%arg3] : <2 x !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %43 = array.read %9[%arg3] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %44 = pod.read %43[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%42, %44) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %38 = pod.read %11[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = pod.read %11[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigLessThan_15::@BigLessThan_15::@constrain(%10, %38, %39) : (!struct.type<@BigLessThan_15::@BigLessThan_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %40 = pod.read %7[@a] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = pod.read %7[@b] : <[@a: !array.type<6 x !felt.type<"babybear">>, @b: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigAdd_9::@BigAdd_9::@constrain(%6, %40, %41) : (!struct.type<@BigAdd_9::@BigAdd_9<[]>>, !array.type<6 x !felt.type<"babybear">>, !array.type<6 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigmult_21.llzk b/examples/circom-demo/test_bigmult_21.llzk new file mode 100644 index 0000000..a0544d4 --- /dev/null +++ b/examples/circom-demo/test_bigmult_21.llzk @@ -0,0 +1,1028 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigMult_4::@BigMult_4<[]>>} { + function.def @SplitThreeFn_0(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.shl %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.uintdiv %arg0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.shl %felt_const_1, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.umod %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c2] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<3 x !felt.type<"babybear">> + } + poly.template @BigMultNoCarry_0 { + struct.def @BigMultNoCarry_0 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<1 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + array.write %nondet_0[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.add %2, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %3 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + array.write %nondet_3[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %2 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %2 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.mul %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %2 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<1 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + array.write %nondet[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.mul %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %4 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + array.write %nondet_2[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.add %2, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %3 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.add %2, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %3 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.add %2, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %3 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.mul %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LongToShortNoEndCarry_3 { + struct.def @LongToShortNoEndCarry_3 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @runningCarry : !array.type<1 x !felt.type<"babybear">> + struct.member @runningCarryRangeChecks : !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @runningCarryRangeChecks$inputs : !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @outRangeChecks : !array.type<2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> + struct.member @outRangeChecks$inputs : !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_1 = array.new : <1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %34 = array.read %array_2[%arg1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %34[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%c0] = %nondet_5 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.while (%arg1 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %34 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%34) + } do { + %34 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = function.call @SplitThreeFn_0(%34, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c0] = %35 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %nondet_6 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %nondet_4[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_4[%c0, %c1] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %34 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %36 = array.read %nondet[%35] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %array_3[%37] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %38[@in] = %36 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%39] = %38 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %40 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + %41 = array.read %array_2[%40] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %42 = pod.read %41[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %41[@count] = %43 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %45 = pod.read %38[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @Num2Bits_1::@Num2Bits_1::@product(%45) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %47 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%45) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %41[@comp] = %46 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %48 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%48] = %41 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.div %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %6 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array_1[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %8[@in] = %7 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %8 : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %9 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %9[@count] = %11 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %34 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %35 = function.call @Num2Bits_2::@Num2Bits_2::@product(%34) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %36 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%34) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %9[@comp] = %35 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %9 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %34 = array.read %array_2[%arg1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %35 = pod.read %34[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %35 : <2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks] = %array_7 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + %13 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_8[%c0] = %14 : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@runningCarry] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %15 = struct.readm %self[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = struct.readm %self[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = struct.readm %self[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %18 = struct.readm %self[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %19 = struct.readm %self[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %20 = struct.readm %self[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet_9 = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_10 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_10[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_10[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_9[%c0] = %nondet_10 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.while (%arg1 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %34 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%34) + } do { + %34 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = function.call @SplitThreeFn_0(%34, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_9[%c0] = %35 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %nondet_11 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_11[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %34 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %15[%35] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %34 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %20[%37] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %21 = array.read %16[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %18[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %16[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.mul %24, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %15[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.sub %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %16[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %15[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %34 = array.read %19[%arg1] : <2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %35 = array.read %20[%arg1] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%34, %36) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %31 = array.read %17[%c0] : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %32 = array.read %18[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%31, %33) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %array_1 = array.new : <1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %15 = array.read %array_2[%arg1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %15[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %15 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%c0] = %nondet_5 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.while (%arg1 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %15 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%15) + } do { + %15 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @SplitThreeFn_0(%15, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c0] = %16 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %nondet_6 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %nondet_4[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_4[%c0, %c1] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %2 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %15 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet[%16] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_3[%18] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@in] = %17 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%20] = %19 : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %21 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array_2[%21] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %26 = pod.read %19[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%26) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %22[@comp] = %27 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %28 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%28] = %22 : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.div %5, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %6 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array_1[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %8[@in] = %7 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %8 : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %9 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %9[@count] = %11 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %15 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%15) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %9[@comp] = %16 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %9 : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_7 = array.new : <2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %15 = array.read %array_2[%arg1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_7[%arg1] = %16 : <2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks] = %array_7 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + %13 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_8[%c0] = %14 : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@runningCarry] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %19 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%19) + } do { + %19 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = function.call @SplitThreeFn_0(%19, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c0] = %20 : <1,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %19 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%20] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %5[%22] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %24 = pod.read %23[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %3[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.mul %9, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %19 = array.read %4[%arg2] : <2 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %20 = array.read %5[%arg2] : <2 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %21 = pod.read %20[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%19, %21) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %16 = array.read %2[%c0] : <1 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %17 = array.read %3[%c0] : <1 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%16, %18) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @BigMult_4 { + struct.def @BigMult_4 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @longshort : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.member @longshort$inputs : !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> + struct.member @mult : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.member @mult$inputs : !pod.type<[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1 x !felt.type<"babybear">>, %arg1: !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %10 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%10) + } do { + %10 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_2[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %11[%c0] = %10 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %11 : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %12 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.subi %12, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %13 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.cmpi eq, %13, %c0 {product_source = "compute"} : index + scf.if %14 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_2[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%20, %21) : (!array.type<1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %15 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_2[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c0] = %15 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %16 : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_2[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_2[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%20, %21) : (!array.type<1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %22 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %10 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%10) + } do { + %10 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %12 = array.read %11[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %13[%c0] = %12 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %13 : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_0[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %18 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@product(%17) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %19 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%17) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %18 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@longshort$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@mult$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "constrain"} + %4 = struct.readm %self[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %self[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %10 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%10) + } do { + %10 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %6[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = array.read %11[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = array.read %14[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %10 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%10) + } do { + %10 = struct.readm %5[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = array.read %10[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %4[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = array.read %12[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %2[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%3, %7) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %6[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %6[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%5, %8, %9) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @compute(%arg0: !array.type<1 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<1 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%2) + } do { + %2 = array.read %arg0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod_2[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %3[%c0] = %2 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %3 : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %4 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %5 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_2[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod_2[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%12, %13) : (!array.type<1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %14 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_2[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c0] = %7 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %8 : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %12 = pod.read %pod_2[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod_2[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%12, %13) : (!array.type<1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %14 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %2 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%2) + } do { + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %3 = struct.readm %2[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_0[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + array.write %5[%c0] = %4 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %5 : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.subi %6, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.cmpi eq, %7, %c0 {product_source = "compute"} : index + scf.if %8 { + %9 = pod.read %pod_0[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "compute"} + %10 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%9) : (!array.type<1 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@longshort$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@mult$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMult_4::@BigMult_4<[]>>, %arg1: !array.type<1 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<1 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %8 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%8) + } do { + %8 = array.read %arg1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %4[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = array.read %9[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %4[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = array.read %12[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1 : !felt.type<"babybear"> + } + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %8 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%8) + } do { + %8 = struct.readm %3[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = array.read %10[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1 : !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = pod.read %2[@in] : <[@in: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%1, %5) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %6 = pod.read %4[@a] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = pod.read %4[@b] : <[@a: !array.type<1 x !felt.type<"babybear">>, @b: !array.type<1 x !felt.type<"babybear">>]>, !array.type<1 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%3, %6, %7) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<1 x !felt.type<"babybear">>, !array.type<1 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigmult_22.llzk b/examples/circom-demo/test_bigmult_22.llzk new file mode 100644 index 0000000..1c2b23b --- /dev/null +++ b/examples/circom-demo/test_bigmult_22.llzk @@ -0,0 +1,1347 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigMult_4::@BigMult_4<[]>>} { + function.def @SplitThreeFn_0(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.shl %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.uintdiv %arg0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.shl %felt_const_1, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.umod %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c2] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<3 x !felt.type<"babybear">> + } + function.def @SplitFn_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2 x !felt.type<"babybear">> + } + poly.template @BigMultNoCarry_0 { + struct.def @BigMultNoCarry_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LongToShortNoEndCarry_3 { + struct.def @LongToShortNoEndCarry_3 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + struct.member @runningCarry : !array.type<3 x !felt.type<"babybear">> + struct.member @outRangeChecks : !array.type<4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> + struct.member @outRangeChecks$inputs : !array.type<4 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @runningCarryRangeChecks : !array.type<3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @runningCarryRangeChecks$inputs : !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %43 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %43[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %43 : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %43 = array.read %array_2[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %43[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %43 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%c0] = %nondet_5 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c1] = %nondet_5 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c2] = %nondet_5 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @SplitThreeFn_0(%45, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%47] = %46 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + } {product_source = "compute"} + %nondet_6 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = array.read %nondet_4[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %nondet_4[%c0, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_4[%c1, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = function.call @SplitFn_1(%3, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %5 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.while (%arg1 = %felt_const_2) : (!felt.type<"babybear">) -> () { + %43 = bool.cmp lt(%arg1, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%43) + } do { + %nondet_14 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_14[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_14[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %43 = array.read %nondet_4[%c2, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %nondet_4[%c1, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %45 = felt.add %43, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %nondet_4[%c0, %c2] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = felt.add %45, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %nondet_6[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %47, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = function.call @SplitFn_1(%49, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %51 = array.read %50[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %51 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %50[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c2] = %52 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %felt_const_3 : !felt.type<"babybear"> + } + %7 = array.read %nondet_4[%c2, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_4[%c1, %c2] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet_6[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %11 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet_0[%44] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_1[%46] : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %47[@in] = %45 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%48] = %47 : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array[%49] : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = function.call @Num2Bits_1::@Num2Bits_1::@product(%54) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %56 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%54) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %50[@comp] = %55 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %57 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%57] = %50 : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.div %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %15 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_3[%c0] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@in] = %16 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%c0] = %17 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %18 = array.read %array_2[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %43 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%43) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %18[@comp] = %44 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_2[%c0] = %18 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %nondet_0[%46] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %45, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %nondet[%50] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.add %48, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.div %52, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%54] = %53 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %nondet[%55] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %array_3[%57] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %58[@in] = %56 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%59] = %58 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %60 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array_2[%60] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %65 = pod.read %58[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = function.call @Num2Bits_2::@Num2Bits_2::@product(%65) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %67 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%65) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %61[@comp] = %66 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %68 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%68] = %61 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %43 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %44 : <4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_9 = array.new : <3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %43 = array.read %array_2[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_9[%arg1] = %44 : <3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks] = %array_9 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@runningCarry] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %22 = struct.readm %self[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = struct.readm %self[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = struct.readm %self[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %25 = struct.readm %self[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %26 = struct.readm %self[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %27 = struct.readm %self[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet_10 = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_11 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_11[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_10[%c0] = %nondet_11 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_10[%c1] = %nondet_11 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_10[%c2] = %nondet_11 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg0[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = function.call @SplitThreeFn_0(%45, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_10[%47] = %46 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_12 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_12[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_13 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_13[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %nondet_10[%c0, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %nondet_10[%c1, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = function.call @SplitFn_1(%30, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = array.read %31[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c1] = %32 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.while (%arg1 = %felt_const_2) : (!felt.type<"babybear">) -> () { + %43 = bool.cmp lt(%arg1, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%43) + } do { + %nondet_14 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_14[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %43 = array.read %nondet_10[%c2, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %nondet_10[%c1, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %43, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %nondet_10[%c0, %c2] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %45, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %nondet_12[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.add %47, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = function.call @SplitFn_1(%49, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %51 = array.read %50[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c2] = %51 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %felt_const_3 : !felt.type<"babybear"> + } + scf.for %arg1 = %c0 to %c4 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %22[%44] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %25[%46] : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %33 = array.read %23[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %27[%c0] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %35 = pod.read %34[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %23[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %36, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %22[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %23[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %27[%46] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %23[%49] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %50, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %arg0[%52] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %22[%54] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.sub %53, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %23[%58] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %56, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %60 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %41 = array.read %23[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %22[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %43 = array.read %24[%arg1] : <4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %44 = array.read %25[%arg1] : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%43, %45) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %43 = array.read %26[%arg1] : <3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %44 = array.read %27[%arg1] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%43, %45) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %22 : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %22 = array.read %array_2[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %22 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%c0] = %nondet_5 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c1] = %nondet_5 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c2] = %nondet_5 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @SplitThreeFn_0(%24, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%26] = %25 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + } {product_source = "compute"} + %nondet_6 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = array.read %nondet_4[%c0, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %nondet_4[%c0, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_4[%c1, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = function.call @SplitFn_1(%3, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c1] = %5 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.while (%arg1 = %felt_const_2) : (!felt.type<"babybear">) -> () { + %22 = bool.cmp lt(%arg1, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%22) + } do { + %nondet_10 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %nondet_4[%c2, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %nondet_4[%c1, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.add %22, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %nondet_4[%c0, %c2] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = felt.add %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet_6[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @SplitFn_1(%28, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = array.read %29[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c2] = %30 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %29[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c2] = %31 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.yield %felt_const_3 : !felt.type<"babybear"> + } + %7 = array.read %nondet_4[%c2, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_4[%c1, %c2] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet_6[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c3] = %11 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %nondet_0[%23] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_1[%25] : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %26[@in] = %24 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%27] = %26 : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array[%28] : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %26[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%33) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %29[@comp] = %34 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %35 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%35] = %29 : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet_0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.div %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %15 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_3[%c0] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@in] = %16 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%c0] = %17 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %18 = array.read %array_2[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %18[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_2[%c0] = %18 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c1 to %c3 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %nondet_0[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.sub %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = felt.div %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%33] = %32 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %nondet[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_3[%36] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %37[@in] = %35 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%38] = %37 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %39 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array_2[%39] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %44 = pod.read %37[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%44) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %40[@comp] = %45 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %46 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%46] = %40 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %22 = array.read %array[%arg1] : <4 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %23 : <4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_9 = array.new : <3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %22 = array.read %array_2[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_9[%arg1] = %23 : <3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks] = %array_9 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@runningCarry] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c3 = arith.constant {product_source = "constrain"} 3 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<3,3 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c1] = %nondet_0 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c2] = %nondet_0 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%22] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = function.call @SplitThreeFn_0(%23, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%25] = %24 : <3,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_2[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %nondet[%c0, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %nondet[%c1, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = function.call @SplitFn_1(%8, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = array.read %9[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.while (%arg2 = %felt_const_2) : (!felt.type<"babybear">) -> () { + %21 = bool.cmp lt(%arg2, %felt_const_3) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%21) + } do { + %nondet_3 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_3[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %nondet[%c2, %c0] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %nondet[%c1, %c1] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = felt.add %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %nondet[%c0, %c2] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %nondet_1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = function.call @SplitFn_1(%27, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %29 = array.read %28[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %felt_const_3 : !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c4 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%22] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %3[%24] : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %5[%c0] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %1[%22] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %5[%24] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %1[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %28, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %arg1[%30] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %0[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = felt.sub %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %1[%36] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %34, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %19 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %21 = array.read %2[%arg2] : <4 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %22 = array.read %3[%arg2] : <4 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%21, %23) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %21 = array.read %4[%arg2] : <3 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %22 = array.read %5[%arg2] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%21, %23) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @BigMult_4 { + struct.def @BigMult_4 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + struct.member @longshort : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.member @longshort$inputs : !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + struct.member @mult : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.member @mult$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %13 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %16 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%25, %26) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %18 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg1[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %20 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%25, %26) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %15 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@product(%20) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %22 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%20) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %21 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@longshort$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@mult$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "constrain"} + %4 = struct.readm %self[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %self[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg0[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %6[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %6[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %5[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %4[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %2[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %4[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%3, %7) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %6[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %6[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%5, %8, %9) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %5 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %17 = pod.read %pod_2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%17, %18) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg1[%10] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %12 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%17, %18) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%8] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %12 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%12) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@longshort$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@mult$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMult_4::@BigMult_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg2[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %3[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%1, %5) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %6 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%3, %6, %7) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigmult_23.llzk b/examples/circom-demo/test_bigmult_23.llzk new file mode 100644 index 0000000..cb8aba3 --- /dev/null +++ b/examples/circom-demo/test_bigmult_23.llzk @@ -0,0 +1,1408 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigMult_4::@BigMult_4<[]>>} { + function.def @SplitThreeFn_0(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.shl %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.uintdiv %arg0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.shl %felt_const_1, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.umod %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c2] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<3 x !felt.type<"babybear">> + } + function.def @SplitFn_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.umod %arg0, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.uintdiv %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2 x !felt.type<"babybear">> + } + poly.template @BigMultNoCarry_0 { + struct.def @BigMultNoCarry_0 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<5 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c5 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c5 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LongToShortNoEndCarry_3 { + struct.def @LongToShortNoEndCarry_3 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @runningCarry : !array.type<5 x !felt.type<"babybear">> + struct.member @runningCarryRangeChecks : !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> + struct.member @runningCarryRangeChecks$inputs : !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @outRangeChecks : !array.type<6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> + struct.member @outRangeChecks$inputs : !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %43 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %43[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %43 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %43 = array.read %array_2[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %43[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %43 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%c0] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c1] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c2] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c3] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c4] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = function.call @SplitThreeFn_0(%45, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%47] = %46 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + } {product_source = "compute"} + %nondet_6 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = array.read %nondet_4[%c0, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %nondet_4[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_4[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = function.call @SplitFn_1(%3, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %5 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c2 to %c5 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %nondet_14 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_14[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_14[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet_4[%44, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %nondet_4[%47, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.add %45, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = felt.sub %43, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %nondet_4[%51, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.add %49, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %nondet_6[%55] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = felt.add %53, %56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @SplitFn_1(%57, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %59 = array.read %58[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%60] = %59 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %58[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%62] = %61 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = array.read %nondet_4[%c4, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_4[%c3, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet_6[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %nondet[%44] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %array_3[%46] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %47[@in] = %45 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %48 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%48] = %47 : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_2[%49] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %55 = function.call @Num2Bits_1::@Num2Bits_1::@product(%54) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %56 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%54) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %50[@comp] = %55 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %57 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%57] = %50 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.div %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %15 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet_0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_1[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@in] = %16 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %17 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %18 = array.read %array[%c0] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %43 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%43) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %18[@comp] = %44 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %18 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %nondet[%46] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = felt.sub %45, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %nondet_0[%50] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %52 = felt.add %48, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.div %52, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%54] = %53 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %56 = array.read %nondet_0[%55] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %58 = array.read %array_1[%57] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %58[@in] = %56 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%59] = %58 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %60 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %array[%60] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %62 = pod.read %61[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %61[@count] = %63 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %65 = pod.read %58[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = function.call @Num2Bits_2::@Num2Bits_2::@product(%65) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %67 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%65) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %61[@comp] = %66 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %68 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%68] = %61 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %43 = array.read %array_2[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %44 : <6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_9 = array.new : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %43 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %44 = pod.read %43[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_9[%arg1] = %44 : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks] = %array_9 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@runningCarry] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %22 = struct.readm %self[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = struct.readm %self[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = struct.readm %self[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %25 = struct.readm %self[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %26 = struct.readm %self[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %27 = struct.readm %self[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet_10 = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_11 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_11[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_11[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_10[%c0] = %nondet_11 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_10[%c1] = %nondet_11 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_10[%c2] = %nondet_11 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_10[%c3] = %nondet_11 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_10[%c4] = %nondet_11 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %arg0[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = function.call @SplitThreeFn_0(%45, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_10[%47] = %46 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_12 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_12[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_13 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_13[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_13[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %nondet_10[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %nondet_10[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = function.call @SplitFn_1(%30, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = array.read %31[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%c1] = %32 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c2 to %c5 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_14 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_14[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_14[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %nondet_10[%44, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %nondet_10[%47, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %49 = felt.add %45, %48 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.sub %43, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %nondet_10[%51, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %49, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %nondet_12[%55] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.add %53, %56 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = function.call @SplitFn_1(%57, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = array.read %58[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_12[%60] = %59 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %22[%44] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %27[%46] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %33 = array.read %23[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %25[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %35 = pod.read %34[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %23[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.mul %36, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %22[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %38, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %45 = array.read %23[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %47 = array.read %25[%46] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %50 = array.read %23[%49] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = felt.mul %50, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %53 = array.read %arg0[%52] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %22[%54] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = felt.sub %53, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %57 = felt.sub %43, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %23[%58] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = felt.add %56, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %60 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %41 = array.read %23[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %22[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %43 = array.read %26[%arg1] : <6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %44 = array.read %27[%arg1] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%43, %45) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %43 = array.read %24[%arg1] : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %44 = array.read %25[%arg1] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %45 = pod.read %44[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%43, %45) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %self = struct.new : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %22 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = array.read %array_2[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %22[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array_2[%arg1] = %22 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_3 = array.new : <6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %nondet_4 = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_5 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_5[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_5[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%c0] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c1] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c2] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c3] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_4[%c4] = %nondet_5 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @SplitThreeFn_0(%24, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_4[%26] = %25 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "compute"} + } {product_source = "compute"} + %nondet_6 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = array.read %nondet_4[%c0, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %nondet_7 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_7[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_7[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = array.read %nondet_4[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %nondet_4[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = function.call @SplitFn_1(%3, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %5 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%c1] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c2 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %nondet_4[%23, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %nondet_4[%26, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.add %24, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = felt.sub %22, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %nondet_4[%30, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = felt.add %28, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %nondet_6[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %32, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = function.call @SplitFn_1(%36, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %38 = array.read %37[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%39] = %38 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %37[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_6[%41] = %40 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %7 = array.read %nondet_4[%c4, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_4[%c3, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet_6[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c5] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %nondet[%23] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %array_3[%25] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %26[@in] = %24 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_3[%27] = %26 : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %28 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_2[%28] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %30 = pod.read %29[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %29[@count] = %31 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %26[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %34 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%33) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %29[@comp] = %34 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %35 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_2[%35] = %29 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %12 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.sub %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.div %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%c0] = %15 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %nondet_0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_1[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %17[@in] = %16 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %17 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %18 = array.read %array[%c0] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %17[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%22) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %18[@comp] = %23 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array[%c0] = %18 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c1 to %c5 step %c1 { + %22 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %nondet[%25] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = felt.sub %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %28 = felt.sub %22, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet_0[%29] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = felt.div %31, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%33] = %32 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %nondet_0[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_1[%36] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %37[@in] = %35 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%38] = %37 : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %39 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %44 = pod.read %37[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %45 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%44) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %40[@comp] = %45 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %46 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46] = %40 : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks$inputs] = %array_3 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_8 = array.new : <6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %22 = array.read %array_2[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + array.write %array_8[%arg1] = %23 : <6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@outRangeChecks] = %array_8 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks$inputs] = %array_1 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_9 = array.new : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %22 = array.read %array[%arg1] : <5 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + array.write %array_9[%arg1] = %23 : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@runningCarryRangeChecks] = %array_9 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@runningCarry] = %nondet_0 : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %c5 = arith.constant {product_source = "constrain"} 5 : index + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c6 = arith.constant {product_source = "constrain"} 6 : index + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@runningCarry] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@runningCarryRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>> {product_source = "constrain"} + %3 = struct.readm %arg0[@runningCarryRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@outRangeChecks] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@outRangeChecks$inputs] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<5,3 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%c0] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c1] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c2] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c3] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet[%c4] = %nondet_0 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = function.call @SplitThreeFn_0(%23, %felt_const_2, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet[%25] = %24 : <5,3 x !felt.type<"babybear">>, <3 x !felt.type<"babybear">> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c2] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c3] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c4] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c0] = %felt_const_0 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_2[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %nondet[%c0, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %nondet[%c1, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.add %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = function.call @SplitFn_1(%8, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = array.read %9[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%c1] = %10 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c2 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %nondet_3 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_3[%c0] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_3[%c1] = %felt_const_0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %nondet[%22, %c0] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = cast.toindex %24 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %nondet[%25, %c1] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %23, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.sub %21, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %nondet[%29, %c2] : <5,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.add %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %33 = cast.toindex %32 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %nondet_1[%33] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %31, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = function.call @SplitFn_1(%35, %felt_const_2, %felt_const_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = array.read %36[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_1[%38] = %37 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %0[%22] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %5[%24] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %3[%c0] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.mul %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %21 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %1[%22] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %3[%24] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %26 = pod.read %25[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %1[%27] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %28, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %arg1[%30] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %0[%32] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = felt.sub %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %1[%36] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = felt.add %34, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %19 = array.read %1[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %0[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %21 = array.read %4[%arg2] : <6 x !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %22 = array.read %5[%arg2] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%21, %23) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %21 = array.read %2[%arg2] : <5 x !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %22 = array.read %3[%arg2] : <5 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %23 = pod.read %22[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%21, %23) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @BigMult_4 { + struct.def @BigMult_4 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + struct.member @mult : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.member @mult$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + struct.member @longshort : !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + struct.member @longshort$inputs : !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %13 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %25 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %18 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg1[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %20[%21] = %19 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %20 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.subi %22, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %23 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.cmpi eq, %23, %c0 {product_source = "compute"} : index + scf.if %24 { + %25 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %15 : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@product(%20) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> + %22 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%20) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %21 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %12[%13] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%15] = %14 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@longshort$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@mult$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %4 = struct.readm %self[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %self[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg0[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %6[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %5[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %2[%14] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = pod.read %6[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%5, %7) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%3, %8, %9) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigMult_4::@BigMult_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c5 = arith.constant {product_source = "compute"} 5 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@BigMult_4::@BigMult_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c5 } : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %5 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %17 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%17, %18) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg1[%10] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %12 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_0[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_0[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%17, %18) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%8] = %6 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %7 : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %12 = pod.read %pod_2[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@compute(%12) : (!array.type<5 x !felt.type<"babybear">>) -> !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %13 : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@longshort$inputs] = %pod_2 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@longshort] = %0 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@mult$inputs] = %pod_0 : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@mult] = %1 : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigMult_4::@BigMult_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMult_4::@BigMult_4<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@BigMult_4::@BigMult_4<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@mult] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mult$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@longshort] : <@BigMult_4::@BigMult_4<[]>>, !struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@longshort$inputs] : <@BigMult_4::@BigMult_4<[]>>, !pod.type<[@in: !array.type<5 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg2[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c5 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %1[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %4[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %3[@out] : <@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !array.type<5 x !felt.type<"babybear">>]>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3::@constrain(%3, %5) : (!struct.type<@LongToShortNoEndCarry_3::@LongToShortNoEndCarry_3<[]>>, !array.type<5 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %6 = pod.read %2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = pod.read %2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%1, %6, %7) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigsub_15.llzk b/examples/circom-demo/test_bigsub_15.llzk new file mode 100644 index 0000000..d43f0f2 --- /dev/null +++ b/examples/circom-demo/test_bigsub_15.llzk @@ -0,0 +1,946 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigSub_6::@BigSub_6<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<2 x !felt.type<"babybear">> + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSub_2 { + struct.def @ModSub_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSub_2::@ModSub_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSub_2::@ModSub_2<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %0[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %4 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %4[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %9 = struct.readm %8[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %9 : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %12 : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSub_2::@ModSub_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.writem %self[@lt] = %13 : <@ModSub_2::@ModSub_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + function.return %self : !struct.type<@ModSub_2::@ModSub_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSub_2::@ModSub_2<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@lt] : <@ModSub_2::@ModSub_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %3 = struct.readm %arg0[@lt$inputs] : <@ModSub_2::@ModSub_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %4 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %2[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + constrain.eq %1, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.sub %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_1::@LessThan_1::@constrain(%2, %12) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_3 { + struct.def @Num2Bits_3 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_3::@Num2Bits_3<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LessThan_4 { + struct.def @LessThan_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_4::@LessThan_4<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_3::@Num2Bits_3::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_4::@LessThan_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_4::@LessThan_4<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + function.return %self : !struct.type<@LessThan_4::@LessThan_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_4::@LessThan_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_4::@LessThan_4<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_4::@LessThan_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_3::@Num2Bits_3::@constrain(%1, %11) : (!struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSubThree_5 { + struct.def @ModSubThree_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @b_plus_c : !felt.type<"babybear"> + struct.member @lt : !struct.type<@LessThan_4::@LessThan_4<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSubThree_5::@ModSubThree_5<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = felt.sub %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %3, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@b_plus_c] = %4 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %5[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_4::@LessThan_4::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + } + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_4::@LessThan_4::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + %14 = struct.readm %13[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %14 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %17 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSubThree_5::@ModSubThree_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + struct.writem %self[@lt] = %18 : <@ModSubThree_5::@ModSubThree_5<[]>>, !struct.type<@LessThan_4::@LessThan_4<[]>> + function.return %self : !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@b_plus_c] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@lt] : <@ModSubThree_5::@ModSubThree_5<[]>>, !struct.type<@LessThan_4::@LessThan_4<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@ModSubThree_5::@ModSubThree_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %5 = felt.sub %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.sub %5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = bool.cmp ge(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %8, "assertion failed" + %9 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = array.read %10[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = array.read %12[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = struct.readm %3[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + constrain.eq %1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_4::@LessThan_4::@constrain(%3, %18) : (!struct.type<@LessThan_4::@LessThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @BigSub_6 { + struct.def @BigSub_6 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + struct.member @underflow : !felt.type<"babybear"> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSub_2::@ModSub_2<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> + struct.member @unit$inputs : !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<5 x !felt.type<"babybear">>, %arg1: !array.type<5 x !felt.type<"babybear">>) -> !struct.type<@BigSub_6::@BigSub_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %30 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %30[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %30 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %30 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSub_2::@ModSub_2::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %30 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSub_2::@ModSub_2::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_1[%34] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@a] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%37] = %35 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %64 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %35[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %35[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %40[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %40 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg1[%44] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_1[%47] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@b] = %45 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%50] = %48 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %64 = pod.read %48[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %48[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %48[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %53[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %53 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %57 { + %64 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %65 = struct.readm %64[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_1[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %66[@c] = %65 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %66 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %67 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %68 = pod.read %67[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %67[@count] = %69 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %66[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %66[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %66[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%71, %72, %73) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %67[@comp] = %74 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array[%c0] = %67 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %64 = felt.sub %30, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %65 = cast.toindex %64 : !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array[%65] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %67 = pod.read %66[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %68 = struct.readm %67[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %69 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %70 = cast.toindex %69 : !felt.type<"babybear"> {product_source = "compute"} + %71 = array.read %array_1[%70] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %71[@c] = %68 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %73 = cast.toindex %72 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%73] = %71 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %74 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %75 = cast.toindex %74 : !felt.type<"babybear"> {product_source = "compute"} + %76 = array.read %array[%75] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %77 = pod.read %76[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %78 = arith.subi %77, %c1 {product_source = "compute"} : index + pod.write %76[@count] = %78 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %79 = arith.cmpi eq, %78, %c0 {product_source = "compute"} : index + scf.if %79 { + %80 = pod.read %71[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %81 = pod.read %71[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %82 = pod.read %71[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %83 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%80, %81, %82) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %76[@comp] = %83 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %84 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %85 = cast.toindex %84 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%85] = %76 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %58 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array[%59] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%63] = %62 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c3] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %12 = struct.readm %11[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@underflow] = %12 : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %30 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %31 : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigSub_6::@BigSub_6<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = struct.readm %self[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %self[@unit0] : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "constrain"} + %17 = struct.readm %self[@unit0$inputs] : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = struct.readm %self[@unit] : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "constrain"} + %19 = struct.readm %self[@unit$inputs] : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %20 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %16[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %14[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %19[%34] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg1[%37] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %19[%40] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %43 { + %50 = struct.readm %16[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %19[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %52 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %50 = felt.sub %30, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %18[%51] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %53 = struct.readm %52[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %54 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %55 = cast.toindex %54 : !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %19[%55] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %57 = pod.read %56[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %53 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %18[%45] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %14[%48] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %26 = array.read %18[%c3] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %27 = struct.readm %26[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSub_2::@ModSub_2::@constrain(%16, %28, %29) : (!struct.type<@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %30 = array.read %18[%arg2] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %31 = array.read %19[%arg2] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSubThree_5::@ModSubThree_5::@constrain(%30, %32, %33, %34) : (!struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@BigSub_6::@BigSub_6<[]>> + } + function.def @compute(%arg0: !array.type<5 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<5 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigSub_6::@BigSub_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %14 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSub_2::@ModSub_2::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSub_2::@ModSub_2::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c5 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_1[%18] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%21] = %19 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %24 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg1[%28] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_1[%31] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%34] = %32 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%36] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %37 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %49 = struct.readm %48[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_1[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %50 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = array.read %array[%c0] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array[%c0] = %51 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %48 = felt.sub %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %49 = cast.toindex %48 : !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array[%49] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %51 = pod.read %50[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %52 = struct.readm %51[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %53 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %54 = cast.toindex %53 : !felt.type<"babybear"> {product_source = "compute"} + %55 = array.read %array_1[%54] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %55[@c] = %52 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %57 = cast.toindex %56 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%57] = %55 : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %58 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array[%59] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %62 = arith.subi %61, %c1 {product_source = "compute"} : index + pod.write %60[@count] = %62 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.cmpi eq, %62, %c0 {product_source = "compute"} : index + scf.if %63 { + %64 = pod.read %55[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %55[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %55[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %60[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %68 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %60 : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%43] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%47] = %46 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c3] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %12 = struct.readm %11[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@underflow] = %12 : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = array.read %array[%arg2] : <4 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %15 : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigSub_6::@BigSub_6<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigSub_6::@BigSub_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigSub_6::@BigSub_6<[]>>, %arg1: !array.type<5 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<5 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c4 = arith.constant {product_source = "constrain"} 4 : index + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<5 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %arg0[@unit0] : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@unit0$inputs] : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %4 = struct.readm %arg0[@unit] : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@unit$inputs] : <@BigSub_6::@BigSub_6<[]>>, !array.type<4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg2[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %2[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%c0] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c1 to %c5 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg1[%17] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %5[%20] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg2[%23] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %5[%26] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %29 { + %36 = struct.readm %2[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %5[%c0] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %36 = felt.sub %16, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %4[%37] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %39 = struct.readm %38[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "constrain"} + %42 = array.read %5[%41] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %43 = pod.read %42[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %4[%31] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %0[%34] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %4[%c3] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %13 = struct.readm %12[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSub_2::@ModSub_2::@constrain(%2, %14, %15) : (!struct.type<@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %16 = array.read %4[%arg3] : <4 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %17 = array.read %5[%arg3] : <4 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSubThree_5::@ModSubThree_5::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigsub_23.llzk b/examples/circom-demo/test_bigsub_23.llzk new file mode 100644 index 0000000..1f7b69c --- /dev/null +++ b/examples/circom-demo/test_bigsub_23.llzk @@ -0,0 +1,912 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigSub_6::@BigSub_6<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSub_2 { + struct.def @ModSub_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSub_2::@ModSub_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSub_2::@ModSub_2<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %0[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %4 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %4[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %9 = struct.readm %8[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %9 : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %12 : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSub_2::@ModSub_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.writem %self[@lt] = %13 : <@ModSub_2::@ModSub_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + function.return %self : !struct.type<@ModSub_2::@ModSub_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSub_2::@ModSub_2<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@lt] : <@ModSub_2::@ModSub_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %3 = struct.readm %arg0[@lt$inputs] : <@ModSub_2::@ModSub_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %4 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %2[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + constrain.eq %1, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.sub %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_1::@LessThan_1::@constrain(%2, %12) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_3 { + struct.def @Num2Bits_3 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_3::@Num2Bits_3<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LessThan_4 { + struct.def @LessThan_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_4::@LessThan_4<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_3::@Num2Bits_3::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_4::@LessThan_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_4::@LessThan_4<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + function.return %self : !struct.type<@LessThan_4::@LessThan_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_4::@LessThan_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_4::@LessThan_4<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_4::@LessThan_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_3::@Num2Bits_3::@constrain(%1, %11) : (!struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSubThree_5 { + struct.def @ModSubThree_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @b_plus_c : !felt.type<"babybear"> + struct.member @lt : !struct.type<@LessThan_4::@LessThan_4<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSubThree_5::@ModSubThree_5<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = felt.sub %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %3, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@b_plus_c] = %4 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %5[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_4::@LessThan_4::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + } + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_4::@LessThan_4::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + %14 = struct.readm %13[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %14 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %17 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSubThree_5::@ModSubThree_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + struct.writem %self[@lt] = %18 : <@ModSubThree_5::@ModSubThree_5<[]>>, !struct.type<@LessThan_4::@LessThan_4<[]>> + function.return %self : !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@b_plus_c] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@lt] : <@ModSubThree_5::@ModSubThree_5<[]>>, !struct.type<@LessThan_4::@LessThan_4<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@ModSubThree_5::@ModSubThree_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %5 = felt.sub %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.sub %5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = bool.cmp ge(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %8, "assertion failed" + %9 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = array.read %10[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = array.read %12[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = struct.readm %3[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + constrain.eq %1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_4::@LessThan_4::@constrain(%3, %18) : (!struct.type<@LessThan_4::@LessThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @BigSub_6 { + struct.def @BigSub_6 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @underflow : !felt.type<"babybear"> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSub_2::@ModSub_2<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> + struct.member @unit$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_6::@BigSub_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %30 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %30[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %30 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %30 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSub_2::@ModSub_2::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %30 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @ModSub_2::@ModSub_2::@compute(%30, %31) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %32 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array_1[%34] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %35[@a] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%37] = %35 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %38 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %38 : !felt.type<"babybear"> {product_source = "compute"} + %40 = array.read %array[%39] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %64 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %35[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %35[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %40[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %40 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %44 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg1[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %46 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %array_1[%47] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %48[@b] = %45 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %49 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%50] = %48 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %array[%52] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.subi %54, %c1 {product_source = "compute"} : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.cmpi eq, %55, %c0 {product_source = "compute"} : index + scf.if %56 { + %64 = pod.read %48[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %65 = pod.read %48[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %66 = pod.read %48[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %67 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%64, %65, %66) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %53[@comp] = %67 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %68 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%69] = %53 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %57 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %57 { + %64 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %65 = struct.readm %64[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %66 = array.read %array_1[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %66[@c] = %65 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %66 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %67 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %68 = pod.read %67[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %69 = arith.subi %68, %c1 {product_source = "compute"} : index + pod.write %67[@count] = %69 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.cmpi eq, %69, %c0 {product_source = "compute"} : index + scf.if %70 { + %71 = pod.read %66[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %72 = pod.read %66[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %66[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%71, %72, %73) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %67[@comp] = %74 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array[%c0] = %67 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %64 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %65 = pod.read %64[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %66 = struct.readm %65[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %67 = array.read %array_1[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %67[@c] = %66 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c1] = %67 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %68 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %69 = pod.read %68[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %70 = arith.subi %69, %c1 {product_source = "compute"} : index + pod.write %68[@count] = %70 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %71 = arith.cmpi eq, %70, %c0 {product_source = "compute"} : index + scf.if %71 { + %72 = pod.read %67[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %73 = pod.read %67[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %74 = pod.read %67[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %75 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%72, %73, %74) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %68[@comp] = %75 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array[%c1] = %68 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %58 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %59 = cast.toindex %58 : !felt.type<"babybear"> {product_source = "compute"} + %60 = array.read %array[%59] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %61 = pod.read %60[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %62 = struct.readm %61[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %63 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%63] = %62 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %12 = struct.readm %11[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@underflow] = %12 : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %30 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %31 : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigSub_6::@BigSub_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = struct.readm %self[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = struct.readm %self[@unit0] : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "constrain"} + %17 = struct.readm %self[@unit0$inputs] : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = struct.readm %self[@unit] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "constrain"} + %19 = struct.readm %self[@unit$inputs] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %20 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %16[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %14[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %19[%34] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %36 = pod.read %35[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %32 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %37 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %arg1[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = cast.toindex %39 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %19[%40] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %42 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = bool.cmp eq(%30, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %43 { + %50 = struct.readm %16[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %19[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %52 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %52, %50 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %50 = array.read %18[%c0] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %51 = struct.readm %50[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %19[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %53 = pod.read %52[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %51 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %44 = felt.sub %30, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %18[%45] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %47 = struct.readm %46[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %48 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %14[%48] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %49, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %26 = array.read %18[%c1] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %27 = struct.readm %26[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %27 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %30 = array.read %18[%arg2] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %31 = array.read %19[%arg2] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %32 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSubThree_5::@ModSubThree_5::@constrain(%30, %32, %33, %34) : (!struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %28 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSub_2::@ModSub_2::@constrain(%16, %28, %29) : (!struct.type<@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigSub_6::@BigSub_6<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigSub_6::@BigSub_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c3 = arith.constant {product_source = "compute"} 3 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %14 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_1 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSub_2::@ModSub_2::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.subi %5, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %7 = arith.cmpi eq, %6, %c0 {product_source = "compute"} : index + scf.if %7 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %16 = function.call @ModSub_2::@ModSub_2::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %9 = struct.readm %8[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %9 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c1 to %c3 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array_1[%18] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %20 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%21] = %19 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array[%23] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.subi %25, %c1 {product_source = "compute"} : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.cmpi eq, %26, %c0 {product_source = "compute"} : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %28 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg1[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_1[%31] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %34 = cast.toindex %33 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%34] = %32 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array[%36] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.subi %38, %c1 {product_source = "compute"} : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %40 = arith.cmpi eq, %39, %c0 {product_source = "compute"} : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%53] = %37 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + %49 = struct.readm %48[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %50 = array.read %array_1[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c0] = %50 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %51 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.subi %52, %c1 {product_source = "compute"} : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.cmpi eq, %53, %c0 {product_source = "compute"} : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array[%c0] = %51 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } else { + %48 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %49 = pod.read %48[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %50 = struct.readm %49[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %51 = array.read %array_1[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %51[@c] = %50 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + array.write %array_1[%c1] = %51 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "compute"} + %52 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %53 = pod.read %52[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %54 = arith.subi %53, %c1 {product_source = "compute"} : index + pod.write %52[@count] = %54 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %55 = arith.cmpi eq, %54, %c0 {product_source = "compute"} : index + scf.if %55 { + %56 = pod.read %51[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %57 = pod.read %51[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %58 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + pod.write %52[@comp] = %59 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array[%c1] = %52 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %43 = cast.toindex %42 : !felt.type<"babybear"> {product_source = "compute"} + %44 = array.read %array[%43] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%47] = %46 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + %12 = struct.readm %11[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@underflow] = %12 : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "compute"} + %array_2 = array.new : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %15 : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@unit] = %array_2 : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "compute"} + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@unit0] = %13 : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@BigSub_6::@BigSub_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigSub_6::@BigSub_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigSub_6::@BigSub_6<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %arg0[@unit0] : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@unit0$inputs] : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> {product_source = "constrain"} + %4 = struct.readm %arg0[@unit] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> {product_source = "constrain"} + %5 = struct.readm %arg0[@unit$inputs] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %2[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c1 to %c3 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg1[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %5[%20] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg2[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %25 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %5[%26] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %29 { + %36 = struct.readm %2[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %5[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %36 = array.read %4[%c0] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %37 = struct.readm %36[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %5[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %39 = pod.read %38[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %4[%31] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %33 = struct.readm %32[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %35 = array.read %0[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = array.read %4[%c1] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %13 = struct.readm %12[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = array.read %4[%arg3] : <2 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> {product_source = "constrain"} + %17 = array.read %5[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> {product_source = "constrain"} + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSubThree_5::@ModSubThree_5::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %14 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @ModSub_2::@ModSub_2::@constrain(%2, %14, %15) : (!struct.type<@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_bigsubmodp_32.llzk b/examples/circom-demo/test_bigsubmodp_32.llzk new file mode 100644 index 0000000..62cff2e --- /dev/null +++ b/examples/circom-demo/test_bigsubmodp_32.llzk @@ -0,0 +1,1351 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@BigSubModP_10::@BigSubModP_10<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LessThan_1 { + struct.def @LessThan_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_1::@LessThan_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@LessThan_1::@LessThan_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_1::@LessThan_1<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_1::@LessThan_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_1::@LessThan_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSub_2 { + struct.def @ModSub_2 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSub_2::@ModSub_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSub_2::@ModSub_2<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %0[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %4 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %4[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_1::@LessThan_1::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_1::@LessThan_1<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %9 = struct.readm %8[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %9 : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %12 : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSub_2::@ModSub_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_1::@LessThan_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_1::@LessThan_1<[]>> + struct.writem %self[@lt] = %13 : <@ModSub_2::@ModSub_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + function.return %self : !struct.type<@ModSub_2::@ModSub_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSub_2::@ModSub_2<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@lt] : <@ModSub_2::@ModSub_2<[]>>, !struct.type<@LessThan_1::@LessThan_1<[]>> + %3 = struct.readm %arg0[@lt$inputs] : <@ModSub_2::@ModSub_2<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %4 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %2[@out] : <@LessThan_1::@LessThan_1<[]>>, !felt.type<"babybear"> + constrain.eq %1, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.sub %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_1::@LessThan_1::@constrain(%2, %12) : (!struct.type<@LessThan_1::@LessThan_1<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_3 { + struct.def @Num2Bits_3 { + struct.member @out : !array.type<5 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_3::@Num2Bits_3<[]>> + %nondet = llzk.nondet : !array.type<5 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c5 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c5 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @LessThan_4 { + struct.def @LessThan_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_16 = felt.const 16 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_4::@LessThan_4<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_3::@Num2Bits_3::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %9 = array.read %8[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_4::@LessThan_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_4::@LessThan_4<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + function.return %self : !struct.type<@LessThan_4::@LessThan_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_4::@LessThan_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_16 = felt.const 16 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_4::@LessThan_4<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_4::@LessThan_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_16 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %9 = array.read %8[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_3::@Num2Bits_3::@constrain(%1, %11) : (!struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSubThree_5 { + struct.def @ModSubThree_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @b_plus_c : !felt.type<"babybear"> + struct.member @lt : !struct.type<@LessThan_4::@LessThan_4<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSubThree_5::@ModSubThree_5<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = felt.sub %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %3, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@b_plus_c] = %4 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %5[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_4::@LessThan_4::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + } + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_4::@LessThan_4::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_4::@LessThan_4<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + %14 = struct.readm %13[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %14 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %17 : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSubThree_5::@ModSubThree_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_4::@LessThan_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_4::@LessThan_4<[]>> + struct.writem %self[@lt] = %18 : <@ModSubThree_5::@ModSubThree_5<[]>>, !struct.type<@LessThan_4::@LessThan_4<[]>> + function.return %self : !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@b_plus_c] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@lt] : <@ModSubThree_5::@ModSubThree_5<[]>>, !struct.type<@LessThan_4::@LessThan_4<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@ModSubThree_5::@ModSubThree_5<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %5 = felt.sub %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.sub %5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = bool.cmp ge(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %8, "assertion failed" + %9 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = array.read %10[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = array.read %12[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = struct.readm %3[@out] : <@LessThan_4::@LessThan_4<[]>>, !felt.type<"babybear"> + constrain.eq %1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_4::@LessThan_4::@constrain(%3, %18) : (!struct.type<@LessThan_4::@LessThan_4<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @BigSub_6 { + struct.def @BigSub_6 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @underflow : !felt.type<"babybear"> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSub_2::@ModSub_2<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> + struct.member @unit$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigSub_6::@BigSub_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigSub_6::@BigSub_6<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %array_1 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %17 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSub_2::@ModSub_2::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> + } + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %5 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %17 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSub_2::@ModSub_2::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_2::@ModSub_2<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> + } + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> + %10 = struct.readm %9[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %10 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %17 = bool.cmp lt(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) + } do { + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %18[@a] = %17 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %18 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %19 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %39 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %18[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + pod.write %19[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + array.write %array[%c0] = %19 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + } + %23 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %24[@b] = %23 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %24 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %25 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.subi %26, %c1 : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.cmpi eq, %27, %c0 : index + scf.if %28 { + %39 = pod.read %24[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %24[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + pod.write %25[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + array.write %array[%c0] = %25 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + } + %29 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> + %30 = struct.readm %29[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %31 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %31[@c] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %31 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %32 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.subi %33, %c1 : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.cmpi eq, %34, %c0 : index + scf.if %35 { + %39 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSubThree_5::@ModSubThree_5::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + pod.write %32[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + array.write %array[%c0] = %32 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + } + %36 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + %38 = struct.readm %37[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + array.write %nondet[%c1] = %38 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + %13 = struct.readm %12[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@underflow] = %13 : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_2::@ModSub_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_2::@ModSub_2<[]>> + struct.writem %self[@unit0] = %14 : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_6::@BigSub_6<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> + %15 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]> + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + array.write %array_2[%c0] = %16 : <1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + struct.writem %self[@unit] = %array_2 : <@BigSub_6::@BigSub_6<[]>>, !array.type<1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> + struct.writem %self[@out] = %nondet : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigSub_6::@BigSub_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigSub_6::@BigSub_6<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@unit0] : <@BigSub_6::@BigSub_6<[]>>, !struct.type<@ModSub_2::@ModSub_2<[]>> + %3 = struct.readm %arg0[@unit0$inputs] : <@BigSub_6::@BigSub_6<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %4 = struct.readm %arg0[@unit] : <@BigSub_6::@BigSub_6<[]>>, !array.type<1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>> + %5 = struct.readm %arg0[@unit$inputs] : <@BigSub_6::@BigSub_6<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %6 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = struct.readm %2[@out] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %11 = array.read %0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %21 = bool.cmp lt(%arg3, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%21) + } do { + %21 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %5[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %5[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %26 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = struct.readm %2[@borrow] : <@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear"> + %28 = array.read %5[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %29 = pod.read %28[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %29, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %4[%c0] : <1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + %31 = struct.readm %30[@out] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + %32 = array.read %0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %12 = array.read %4[%c0] : <1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + %13 = struct.readm %12[@borrow] : <@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear"> + constrain.eq %1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSub_2::@ModSub_2::@constrain(%2, %14, %15) : (!struct.type<@ModSub_2::@ModSub_2<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + %16 = array.read %4[%c0] : <1 x !struct.type<@ModSubThree_5::@ModSubThree_5<[]>>>, !struct.type<@ModSubThree_5::@ModSubThree_5<[]>> + %17 = array.read %5[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSubThree_5::@ModSubThree_5::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSubThree_5::@ModSubThree_5<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSum_7 { + struct.def @ModSum_7 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_7::@ModSum_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_7::@ModSum_7<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> + %6 = array.read %5[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_7::@ModSum_7<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_7::@ModSum_7<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@ModSum_7::@ModSum_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_7::@ModSum_7<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_7::@ModSum_7<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_7::@ModSum_7<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<4 x !felt.type<"babybear">> + %7 = array.read %6[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSumThree_8 { + struct.def @ModSumThree_8 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_8::@ModSumThree_8<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_3::@Num2Bits_3::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %7 = array.read %6[%c3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %10 = array.read %9[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_8::@ModSumThree_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_8::@ModSumThree_8<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + function.return %self : !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_8::@ModSumThree_8<[]>>, !struct.type<@Num2Bits_3::@Num2Bits_3<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_8::@ModSumThree_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %8 = array.read %7[%c3] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_3::@Num2Bits_3<[]>>, !array.type<5 x !felt.type<"babybear">> + %10 = array.read %9[%c4] : <5 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_3::@Num2Bits_3::@constrain(%2, %17) : (!struct.type<@Num2Bits_3::@Num2Bits_3<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_9 { + struct.def @BigAdd_9 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit : !array.type<1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + struct.member @unit$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + struct.member @unit0 : !struct.type<@ModSum_7::@ModSum_7<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@BigAdd_9::@BigAdd_9<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %array_0 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]> + %pod_1 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_1[@a] = %1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %17 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSum_7::@ModSum_7::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_7::@ModSum_7<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_7::@ModSum_7<[]>> + } + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_1[@b] = %5 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %17 = pod.read %pod_1[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_1[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSum_7::@ModSum_7::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_7::@ModSum_7<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_7::@ModSum_7<[]>> + } + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_7::@ModSum_7<[]>> + %10 = struct.readm %9[@sum] : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %17 = bool.cmp lt(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) + } do { + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %18[@a] = %17 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %18 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %19 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %39 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %18[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %19[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array[%c0] = %19 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %23 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %24[@b] = %23 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %24 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %25 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.subi %26, %c1 : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.cmpi eq, %27, %c0 : index + scf.if %28 { + %39 = pod.read %24[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %24[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %25[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array[%c0] = %25 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %29 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_7::@ModSum_7<[]>> + %30 = struct.readm %29[@carry] : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + %31 = array.read %array_0[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %31[@c] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %31 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %32 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.subi %33, %c1 : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.cmpi eq, %34, %c0 : index + scf.if %35 { + %39 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_8::@ModSumThree_8::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + pod.write %32[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array[%c0] = %32 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + } + %36 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %38 = struct.readm %37[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + array.write %nondet[%c1] = %38 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %13 = struct.readm %12[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + array.write %nondet[%c2] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@unit$inputs] = %array_0 : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + %14 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + array.write %array_2[%c0] = %15 : <1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + struct.writem %self[@unit] = %array_2 : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + struct.writem %self[@unit0$inputs] = %pod_1 : <@BigAdd_9::@BigAdd_9<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_7::@ModSum_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_7::@ModSum_7<[]>> + struct.writem %self[@unit0] = %16 : <@BigAdd_9::@BigAdd_9<[]>>, !struct.type<@ModSum_7::@ModSum_7<[]>> + struct.writem %self[@out] = %nondet : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigAdd_9::@BigAdd_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<3 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@unit] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>> + %2 = struct.readm %arg0[@unit$inputs] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %3 = struct.readm %arg0[@unit0] : <@BigAdd_9::@BigAdd_9<[]>>, !struct.type<@ModSum_7::@ModSum_7<[]>> + %4 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_9::@BigAdd_9<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = struct.readm %3[@sum] : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + %10 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %21 = bool.cmp lt(%arg3, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%21) + } do { + %21 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %2[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %2[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %26 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = struct.readm %3[@carry] : <@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear"> + %28 = array.read %2[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %29 = pod.read %28[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %29, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %1[%c0] : <1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %31 = struct.readm %30[@sum] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %32 = array.read %0[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %1[%c0] : <1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear"> + %13 = array.read %0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %1[%c0] : <1 x !struct.type<@ModSumThree_8::@ModSumThree_8<[]>>>, !struct.type<@ModSumThree_8::@ModSumThree_8<[]>> + %15 = array.read %2[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %15[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSumThree_8::@ModSumThree_8::@constrain(%14, %16, %17, %18) : (!struct.type<@ModSumThree_8::@ModSumThree_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + %19 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSum_7::@ModSum_7::@constrain(%3, %19, %20) : (!struct.type<@ModSum_7::@ModSum_7<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigSubModP_10 { + struct.def @BigSubModP_10 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @flag : !felt.type<"babybear"> + struct.member @tmp : !array.type<2 x !felt.type<"babybear">> + struct.member @add : !struct.type<@BigAdd_9::@BigAdd_9<[]>> + struct.member @add$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + struct.member @sub : !struct.type<@BigSub_6::@BigSub_6<[]>> + struct.member @sub$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigSubModP_10::@BigSubModP_10<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@BigSubModP_10::@BigSubModP_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %arg0[%17] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_3[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %19 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %22 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %31 = pod.read %pod_3[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_3[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = function.call @BigSub_6::@BigSub_6::@compute(%31, %32) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %33 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %arg1[%24] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod_3[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %26[%27] = %25 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@b] = %26 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %29 = arith.subi %28, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %29 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.cmpi eq, %29, %c0 {product_source = "compute"} : index + scf.if %30 { + %31 = pod.read %pod_3[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %32 = pod.read %pod_3[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = function.call @BigSub_6::@BigSub_6::@compute(%31, %32) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %33 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %1 = struct.readm %0[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@flag] = %1 : <@BigSubModP_10::@BigSubModP_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %19 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = pod.read %pod_1[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %21[%22] = %20 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %21 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %24 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %33 = pod.read %pod_1[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_1[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @BigAdd_9::@BigAdd_9::@compute(%33, %34) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %27 = array.read %arg2[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_1[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %28[%29] = %27 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %28 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.subi %30, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %32 = arith.cmpi eq, %31, %c0 {product_source = "compute"} : index + scf.if %32 { + %33 = pod.read %pod_1[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_1[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %35 = function.call @BigAdd_9::@BigAdd_9::@compute(%33, %34) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %35 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %17 = felt.sub %felt_const_1, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %18 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %19 = struct.readm %18[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %19[%20] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %17, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%23] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %nondet[%24] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + %27 = struct.readm %26[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %28 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = felt.mul %1, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.add %25, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%32] = %31 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sub$inputs] = %pod_3 : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + struct.writem %self[@sub] = %2 : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + struct.writem %self[@add$inputs] = %pod_1 : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@add] = %3 : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@tmp] = %nondet : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@out] = %nondet_0 : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %4 = struct.readm %self[@out] : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@flag] : <@BigSubModP_10::@BigSubModP_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = struct.readm %self[@tmp] : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = struct.readm %self[@add] : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@add$inputs] : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %self[@sub] : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "constrain"} + %10 = struct.readm %self[@sub$inputs] : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %10[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%22] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %10[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %11 = struct.readm %9[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = struct.readm %9[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg2[%23] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %25[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.sub %felt_const_1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %9[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.mul %17, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %6[%22] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %6[%24] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = struct.readm %7[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.mul %5, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %25, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %4[%31] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = pod.read %10[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = pod.read %10[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigSub_6::@BigSub_6::@constrain(%9, %12, %13) : (!struct.type<@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %14 = pod.read %8[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = pod.read %8[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigAdd_9::@BigAdd_9::@constrain(%7, %14, %15) : (!struct.type<@BigAdd_9::@BigAdd_9<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@BigSubModP_10::@BigSubModP_10<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigSubModP_10::@BigSubModP_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@BigSubModP_10::@BigSubModP_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_3[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%8] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %7 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %10 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %19 = pod.read %pod_3[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_3[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @BigSub_6::@BigSub_6::@compute(%19, %20) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %21 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %arg1[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_3[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@b] = %14 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %17 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_3[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_3[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %21 = function.call @BigSub_6::@BigSub_6::@compute(%19, %20) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %21 : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %1 = struct.readm %0[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@flag] = %1 : <@BigSubModP_10::@BigSubModP_10<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %6[%7] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_1[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %9 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %12 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %21 = pod.read %pod_1[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_1[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @BigAdd_9::@BigAdd_9::@compute(%21, %22) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %14 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg2[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_1[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %16[%17] = %15 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %16 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.subi %18, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %19 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.cmpi eq, %19, %c0 {product_source = "compute"} : index + scf.if %20 { + %21 = pod.read %pod_1[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %22 = pod.read %pod_1[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @BigAdd_9::@BigAdd_9::@compute(%21, %22) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.sub %felt_const_1, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %7[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.mul %5, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11] = %10 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %nondet[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %15[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.mul %1, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %13, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%20] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@sub$inputs] = %pod_3 : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigSub_6::@BigSub_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + struct.writem %self[@sub] = %2 : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "compute"} + struct.writem %self[@add$inputs] = %pod_1 : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_9::@BigAdd_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@add] = %3 : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "compute"} + struct.writem %self[@tmp] = %nondet : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@out] = %nondet_0 : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@BigSubModP_10::@BigSubModP_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigSubModP_10::@BigSubModP_10<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg3: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@flag] : <@BigSubModP_10::@BigSubModP_10<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = struct.readm %arg0[@tmp] : <@BigSubModP_10::@BigSubModP_10<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@add] : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigAdd_9::@BigAdd_9<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@add$inputs] : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@sub] : <@BigSubModP_10::@BigSubModP_10<[]>>, !struct.type<@BigSub_6::@BigSub_6<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@sub$inputs] : <@BigSubModP_10::@BigSubModP_10<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%13] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %6[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg2[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %6[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = struct.readm %5[@underflow] : <@BigSub_6::@BigSub_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %5[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg3[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%22] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %12 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.sub %felt_const_1, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %5[@out] : <@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %2[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %2[%20] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = struct.readm %3[@out] : <@BigAdd_9::@BigAdd_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %22[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = felt.mul %1, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.add %21, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %0[%27] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = pod.read %6[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %6[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigSub_6::@BigSub_6::@constrain(%5, %8, %9) : (!struct.type<@BigSub_6::@BigSub_6<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigAdd_9::@BigAdd_9::@constrain(%3, %10, %11) : (!struct.type<@BigAdd_9::@BigAdd_9<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_fp12_add_22.llzk b/examples/circom-demo/test_fp12_add_22.llzk new file mode 100644 index 0000000..9a4c22b --- /dev/null +++ b/examples/circom-demo/test_fp12_add_22.llzk @@ -0,0 +1,2442 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Fp12Add_16::@Fp12Add_16<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSum_1 { + struct.def @ModSum_1 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_1::@ModSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_1::@ModSum_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %6 = array.read %5[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@ModSum_1::@ModSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_1::@ModSum_1<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSumThree_3 { + struct.def @ModSumThree_3 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_3::@ModSumThree_3<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + function.return %self : !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %8 = array.read %7[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%2, %17) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_4 { + struct.def @BigAdd_4 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + struct.member @unit$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigAdd_4::@BigAdd_4<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %array_1 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %17 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSum_1::@ModSum_1::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + } + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %5 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %17 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSum_1::@ModSum_1::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + } + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + %10 = struct.readm %9[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %17 = bool.cmp lt(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) + } do { + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %18[@a] = %17 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %18 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %19 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %39 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %18[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + pod.write %19[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array[%c0] = %19 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + } + %23 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %24[@b] = %23 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %24 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %25 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.subi %26, %c1 : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.cmpi eq, %27, %c0 : index + scf.if %28 { + %39 = pod.read %24[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %24[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + pod.write %25[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array[%c0] = %25 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + } + %29 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + %30 = struct.readm %29[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %31 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %31[@c] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %31 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %32 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.subi %33, %c1 : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.cmpi eq, %34, %c0 : index + scf.if %35 { + %39 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + pod.write %32[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array[%c0] = %32 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + } + %36 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %38 = struct.readm %37[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + array.write %nondet[%c1] = %38 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %13 = struct.readm %12[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + array.write %nondet[%c2] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.writem %self[@unit0] = %14 : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.writem %self[@unit$inputs] = %array_1 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + %15 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %16 = pod.read %15[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array_2[%c0] = %16 : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + struct.writem %self[@unit] = %array_2 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + struct.writem %self[@out] = %nondet : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@unit0] : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> + %2 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %3 = struct.readm %arg0[@unit] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + %4 = struct.readm %arg0[@unit$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = struct.readm %1[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %10 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %21 = bool.cmp lt(%arg3, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%21) + } do { + %21 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %26 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = struct.readm %1[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %28 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %29 = pod.read %28[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %29, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %3[%c0] : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %31 = struct.readm %30[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %32 = array.read %0[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %3[%c0] : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %13 = array.read %0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSum_1::@ModSum_1::@constrain(%1, %14, %15) : (!struct.type<@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + %16 = array.read %3[%c0] : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %17 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSumThree_3::@ModSumThree_3::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @LessThan_5 { + struct.def @LessThan_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_5::@LessThan_5<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_5::@LessThan_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_5::@LessThan_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@LessThan_5::@LessThan_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_5::@LessThan_5<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_5::@LessThan_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_5::@LessThan_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @IsZero_6 { + struct.def @IsZero_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_6::@IsZero_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@IsZero_6::@IsZero_6<[]>> + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@inv] = %5 : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + scf.yield %felt_const_0 : !felt.type<"babybear"> + } + %2 = felt.neg %arg0 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %4 : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@IsZero_6::@IsZero_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_6::@IsZero_6<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@inv] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + %2 = felt.neg %arg1 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @IsEqual_7 { + struct.def @IsEqual_7 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_6::@IsZero_6<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_7::@IsEqual_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@IsEqual_7::@IsEqual_7<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.subi %3, %c1 : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.cmpi eq, %4, %c0 : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %10 = function.call @IsZero_6::@IsZero_6::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_6::@IsZero_6<[]>> + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_6::@IsZero_6<[]>> + } + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_6::@IsZero_6<[]>> + %7 = struct.readm %6[@out] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %7 : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_7::@IsEqual_7<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_6::@IsZero_6<[]>> + struct.writem %self[@isz] = %8 : <@IsEqual_7::@IsEqual_7<[]>>, !struct.type<@IsZero_6::@IsZero_6<[]>> + function.return %self : !struct.type<@IsEqual_7::@IsEqual_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@isz] : <@IsEqual_7::@IsEqual_7<[]>>, !struct.type<@IsZero_6::@IsZero_6<[]>> + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_7::@IsEqual_7<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %1[@out] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @IsZero_6::@IsZero_6::@constrain(%1, %8) : (!struct.type<@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @AND_8 { + struct.def @AND_8 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@AND_8::@AND_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_8::@AND_8<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_8::@AND_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_8::@AND_8<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OR_9 { + struct.def @OR_9 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@OR_9::@OR_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_9::@OR_9<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_9::@OR_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_9::@OR_9<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigLessThan_10 { + struct.def @BigLessThan_10 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @ands : !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.member @ands$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @eq_ands : !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.member @eq_ands$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @ors : !array.type<2 x !struct.type<@OR_9::@OR_9<[]>>> + struct.member @ors$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @lt : !array.type<3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + struct.member @lt$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @eq : !array.type<3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + struct.member @eq$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigLessThan_10::@BigLessThan_10<[]>> + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_1[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %array_2 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_3 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_3[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + %array_4 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_5 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_5[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array_5[%arg2] = %4 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + } + %array_6 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_7 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_7[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + array.write %array_7[%arg2] = %4 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + } + %array_8 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %array_6[%7] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c0] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %array_6[%10] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %11[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %12 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_6[%12] = %11 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = array.read %array_5[%13] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %14[@count] = %16 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %57 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @LessThan_5::@LessThan_5::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %14[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_5[%59] = %14 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + } + %18 = cast.toindex %4 : !felt.type<"babybear"> + %19 = array.read %arg1[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %4 : !felt.type<"babybear"> + %21 = array.read %array_6[%20] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %22[%c1] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %4 : !felt.type<"babybear"> + %24 = array.read %array_6[%23] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %24[@in] = %22 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %25 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_6[%25] = %24 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %26 = cast.toindex %4 : !felt.type<"babybear"> + %27 = array.read %array_5[%26] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %28 = pod.read %27[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.subi %28, %c1 : index + pod.write %27[@count] = %29 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %30 = arith.cmpi eq, %29, %c0 : index + scf.if %30 { + %57 = pod.read %24[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @LessThan_5::@LessThan_5::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %27[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_5[%59] = %27 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + } + %31 = cast.toindex %4 : !felt.type<"babybear"> + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = cast.toindex %4 : !felt.type<"babybear"> + %34 = array.read %array_8[%33] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %35 = pod.read %34[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %35[%c0] = %32 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = cast.toindex %4 : !felt.type<"babybear"> + %37 = array.read %array_8[%36] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %37[@in] = %35 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %38 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_8[%38] = %37 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %39 = cast.toindex %4 : !felt.type<"babybear"> + %40 = array.read %array_7[%39] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.subi %41, %c1 : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %43 = arith.cmpi eq, %42, %c0 : index + scf.if %43 { + %57 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @IsEqual_7::@IsEqual_7::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_7::@IsEqual_7<[]>> + pod.write %40[@comp] = %58 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_7[%59] = %40 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + } + %44 = cast.toindex %4 : !felt.type<"babybear"> + %45 = array.read %arg1[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = cast.toindex %4 : !felt.type<"babybear"> + %47 = array.read %array_8[%46] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %48 = pod.read %47[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %48[%c1] = %45 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = cast.toindex %4 : !felt.type<"babybear"> + %50 = array.read %array_8[%49] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %50[@in] = %48 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %51 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_8[%51] = %50 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %52 = cast.toindex %4 : !felt.type<"babybear"> + %53 = array.read %array_7[%52] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %55 = arith.subi %54, %c1 : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %56 = arith.cmpi eq, %55, %c0 : index + scf.if %56 { + %57 = pod.read %50[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @IsEqual_7::@IsEqual_7::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_7::@IsEqual_7<[]>> + pod.write %53[@comp] = %58 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_7[%59] = %53 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + } + } + %0 = scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %4 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%4) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %4 = bool.cmp eq(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %4 { + %6 = array.read %array_7[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %8 = struct.readm %7[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %9 = array.read %array_0[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %9[@a] = %8 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c1] = %9 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %54 = pod.read %9[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %9[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %10[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array[%c1] = %10 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %14 = array.read %array_5[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %16 = struct.readm %15[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %17 = array.read %array_0[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %17[@b] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c1] = %17 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %18 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %54 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %18[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array[%c1] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %22 = array.read %array_7[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %24 = struct.readm %23[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %25 = array.read %array_2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %25[@a] = %24 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c1] = %25 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %26 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %54 = pod.read %25[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %26[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c1] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %30 = array.read %array_7[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %32 = struct.readm %31[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %33 = array.read %array_2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %33[@b] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c1] = %33 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %34 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %36 = arith.subi %35, %c1 : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.cmpi eq, %36, %c0 : index + scf.if %37 { + %54 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %34[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c1] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %38 = array.read %array_5[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %40 = struct.readm %39[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %41 = array.read %array_4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %41[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c1] = %41 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %42 = array.read %array_3[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %44 = arith.subi %43, %c1 : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %45 = arith.cmpi eq, %44, %c0 : index + scf.if %45 { + %54 = pod.read %41[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %42[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_3[%c1] = %42 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + %46 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %47 = pod.read %46[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %48 = struct.readm %47[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %49 = array.read %array_4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %49[@b] = %48 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c1] = %49 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %50 = array.read %array_3[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %52 = arith.subi %51, %c1 : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.cmpi eq, %52, %c0 : index + scf.if %53 { + %54 = pod.read %49[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %49[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %50[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_3[%c1] = %50 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + } else { + %6 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %8 = struct.readm %7[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %9 = array.read %array_0[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %9[@a] = %8 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %9 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %10 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %54 = pod.read %9[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %9[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %10[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array[%c0] = %10 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %14 = array.read %array_5[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %16 = struct.readm %15[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %17 = array.read %array_0[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %17[@b] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_0[%c0] = %17 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %18 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %54 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %18[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array[%c0] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %22 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %24 = struct.readm %23[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %25 = array.read %array_2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %25[@a] = %24 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c0] = %25 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %26 = array.read %array_1[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %54 = pod.read %25[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %26[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c0] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %30 = array.read %array_7[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %32 = struct.readm %31[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %33 = array.read %array_2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %33[@b] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c0] = %33 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %34 = array.read %array_1[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %36 = arith.subi %35, %c1 : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.cmpi eq, %36, %c0 : index + scf.if %37 { + %54 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %34[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c0] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %38 = array.read %array_3[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + %40 = struct.readm %39[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + %41 = array.read %array_4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %41[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c0] = %41 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %42 = array.read %array_3[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %44 = arith.subi %43, %c1 : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %45 = arith.cmpi eq, %44, %c0 : index + scf.if %45 { + %54 = pod.read %41[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %42[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_3[%c0] = %42 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + %46 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %47 = pod.read %46[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %48 = struct.readm %47[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %49 = array.read %array_4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %49[@b] = %48 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_4[%c0] = %49 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %50 = array.read %array_3[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %52 = arith.subi %51, %c1 : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.cmpi eq, %52, %c0 : index + scf.if %53 { + %54 = pod.read %49[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %49[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %50[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_3[%c0] = %50 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + } + %5 = felt.sub %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } + %1 = array.read %array_3[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + %3 = struct.readm %2[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + struct.writem %self[@ands$inputs] = %array_0 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_9 = array.new : <2 x !struct.type<@AND_8::@AND_8<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_9[%arg2] = %5 : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + } + struct.writem %self[@ands] = %array_9 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.writem %self[@eq_ands$inputs] = %array_2 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_10 = array.new : <2 x !struct.type<@AND_8::@AND_8<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_1[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_10[%arg2] = %5 : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + } + struct.writem %self[@eq_ands] = %array_10 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.writem %self[@eq$inputs] = %array_8 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_11 = array.new : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_7[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + array.write %array_11[%arg2] = %5 : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + } + struct.writem %self[@eq] = %array_11 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + struct.writem %self[@lt$inputs] = %array_6 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_12 = array.new : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_5[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + array.write %array_12[%arg2] = %5 : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + } + struct.writem %self[@lt] = %array_12 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + struct.writem %self[@ors$inputs] = %array_4 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_13 = array.new : <2 x !struct.type<@OR_9::@OR_9<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_3[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_13[%arg2] = %5 : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + } + struct.writem %self[@ors] = %array_13 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@OR_9::@OR_9<[]>>> + function.return %self : !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@ands] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + %2 = struct.readm %arg0[@ands$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %3 = struct.readm %arg0[@eq_ands] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + %4 = struct.readm %arg0[@eq_ands$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %5 = struct.readm %arg0[@ors] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@OR_9::@OR_9<[]>>> + %6 = struct.readm %arg0[@ors$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %7 = struct.readm %arg0[@lt] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + %8 = struct.readm %arg0[@lt$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %9 = struct.readm %arg0[@eq] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + %10 = struct.readm %arg0[@eq$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg1[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %14 : !felt.type<"babybear"> + %18 = array.read %8[%17] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %19 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = array.read %19[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg2[%21] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %14 : !felt.type<"babybear"> + %24 = array.read %8[%23] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %25 = pod.read %24[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %26 = array.read %25[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %14 : !felt.type<"babybear"> + %28 = array.read %arg1[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %14 : !felt.type<"babybear"> + %30 = array.read %10[%29] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %31 = pod.read %30[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %32 = array.read %31[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %14 : !felt.type<"babybear"> + %34 = array.read %arg2[%33] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = cast.toindex %14 : !felt.type<"babybear"> + %36 = array.read %10[%35] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %37 = pod.read %36[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %38 = array.read %37[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %11 = scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %14 = bool.cmp ge(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%14) %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">): + %14 = bool.cmp eq(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %14 { + %16 = array.read %9[%c2] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %17 = struct.readm %16[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %18 = array.read %2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %7[%c1] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %21 = struct.readm %20[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %22 = array.read %2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %23 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %9[%c2] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %25 = struct.readm %24[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %26 = array.read %4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %27 = pod.read %26[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = array.read %9[%c1] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %29 = struct.readm %28[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %30 = array.read %4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %31 = pod.read %30[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %7[%c2] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %33 = struct.readm %32[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %34 = array.read %6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %35 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = array.read %1[%c1] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %37 = struct.readm %36[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %38 = array.read %6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %39 = pod.read %38[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %16 = array.read %3[%c1] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %17 = struct.readm %16[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %18 = array.read %2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %7[%c0] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %21 = struct.readm %20[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %22 = array.read %2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %23 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %3[%c1] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %25 = struct.readm %24[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %26 = array.read %4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %27 = pod.read %26[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = array.read %9[%c0] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %29 = struct.readm %28[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %30 = array.read %4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %31 = pod.read %30[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %5[%c1] : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + %33 = struct.readm %32[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + %34 = array.read %6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %35 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = array.read %1[%c0] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %37 = struct.readm %36[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %38 = array.read %6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %39 = pod.read %38[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %15 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %15 : !felt.type<"babybear"> + } + %12 = array.read %5[%c0] : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + %13 = struct.readm %12[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + constrain.eq %0, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %1[%arg3] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %15 = array.read %2[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_8::@AND_8::@constrain(%14, %16, %17) : (!struct.type<@AND_8::@AND_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %3[%arg3] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %15 = array.read %4[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_8::@AND_8::@constrain(%14, %16, %17) : (!struct.type<@AND_8::@AND_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = array.read %9[%arg3] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %15 = array.read %10[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @IsEqual_7::@IsEqual_7::@constrain(%14, %16) : (!struct.type<@IsEqual_7::@IsEqual_7<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = array.read %7[%arg3] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %15 = array.read %8[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_5::@LessThan_5::@constrain(%14, %16) : (!struct.type<@LessThan_5::@LessThan_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %5[%arg3] : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + %15 = array.read %6[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_9::@OR_9::@constrain(%14, %16, %17) : (!struct.type<@OR_9::@OR_9<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @ModSub_11 { + struct.def @ModSub_11 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_5::@LessThan_5<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSub_11::@ModSub_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSub_11::@ModSub_11<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %0[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_5::@LessThan_5::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + } + %4 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %4[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_5::@LessThan_5::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %9 = struct.readm %8[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %9 : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %12 : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSub_11::@ModSub_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + struct.writem %self[@lt] = %13 : <@ModSub_11::@ModSub_11<[]>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + function.return %self : !struct.type<@ModSub_11::@ModSub_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSub_11::@ModSub_11<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@lt] : <@ModSub_11::@ModSub_11<[]>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %3 = struct.readm %arg0[@lt$inputs] : <@ModSub_11::@ModSub_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %4 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %2[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + constrain.eq %1, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.sub %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_5::@LessThan_5::@constrain(%2, %12) : (!struct.type<@LessThan_5::@LessThan_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @LessThan_12 { + struct.def @LessThan_12 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_12::@LessThan_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_12::@LessThan_12<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_12::@LessThan_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_12::@LessThan_12<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + function.return %self : !struct.type<@LessThan_12::@LessThan_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_12::@LessThan_12<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_12::@LessThan_12<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_12::@LessThan_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%1, %11) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSubThree_13 { + struct.def @ModSubThree_13 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @bplusc : !felt.type<"babybear"> + struct.member @lt : !struct.type<@LessThan_12::@LessThan_12<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSubThree_13::@ModSubThree_13<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = felt.sub %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %3, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@bplusc] = %4 : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %5[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_12::@LessThan_12::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_12::@LessThan_12<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + } + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_12::@LessThan_12::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_12::@LessThan_12<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + %14 = struct.readm %13[@out] : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %14 : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %17 : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSubThree_13::@ModSubThree_13<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + struct.writem %self[@lt] = %18 : <@ModSubThree_13::@ModSubThree_13<[]>>, !struct.type<@LessThan_12::@LessThan_12<[]>> + function.return %self : !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@bplusc] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@lt] : <@ModSubThree_13::@ModSubThree_13<[]>>, !struct.type<@LessThan_12::@LessThan_12<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@ModSubThree_13::@ModSubThree_13<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %5 = felt.sub %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.sub %5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = bool.cmp ge(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %8, "assertion failed" + %9 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = array.read %10[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = array.read %12[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = struct.readm %3[@out] : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + constrain.eq %1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_12::@LessThan_12::@constrain(%3, %18) : (!struct.type<@LessThan_12::@LessThan_12<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @BigSub_14 { + struct.def @BigSub_14 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @underflow : !felt.type<"babybear"> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSub_11::@ModSub_11<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + struct.member @unit$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigSub_14::@BigSub_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigSub_14::@BigSub_14<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %14 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSub_11::@ModSub_11::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_11::@ModSub_11<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + } + %4 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSub_11::@ModSub_11::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_11::@ModSub_11<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + %9 = struct.readm %8[@out] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %9 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c3 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg0[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %array_1[%18] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + array.write %array_1[%21] = %19 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %array[%23] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %array_1[%31] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + array.write %array_1[%34] = %32 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %array[%36] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %37 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + %49 = struct.readm %48[@borrow] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %50 = array.read %array_1[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %50 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %51 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.subi %52, %c1 : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %54 = arith.cmpi eq, %53, %c0 : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %58 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + array.write %array[%c0] = %51 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + } else { + %48 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %49 = pod.read %48[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %50 = struct.readm %49[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %51 = array.read %array_1[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %51[@c] = %50 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c1] = %51 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %52 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %53 = pod.read %52[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %54 = arith.subi %53, %c1 : index + pod.write %52[@count] = %54 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %55 = arith.cmpi eq, %54, %c0 : index + scf.if %55 { + %56 = pod.read %51[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %57 = pod.read %51[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %58 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %59 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %52[@comp] = %59 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + array.write %array[%c1] = %52 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %42 : !felt.type<"babybear"> + %44 = array.read %array[%43] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %46 = struct.readm %45[@out] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %47 = cast.toindex %14 : !felt.type<"babybear"> + array.write %nondet[%47] = %46 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %12 = struct.readm %11[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + struct.writem %self[@underflow] = %12 : <@BigSub_14::@BigSub_14<[]>>, !felt.type<"babybear"> + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_14::@BigSub_14<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + struct.writem %self[@unit0] = %13 : <@BigSub_14::@BigSub_14<[]>>, !struct.type<@ModSub_11::@ModSub_11<[]>> + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + array.write %array_2[%arg2] = %15 : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + } + struct.writem %self[@unit] = %array_2 : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + struct.writem %self[@out] = %nondet : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigSub_14::@BigSub_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigSub_14::@BigSub_14<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@underflow] : <@BigSub_14::@BigSub_14<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@unit0] : <@BigSub_14::@BigSub_14<[]>>, !struct.type<@ModSub_11::@ModSub_11<[]>> + %3 = struct.readm %arg0[@unit0$inputs] : <@BigSub_14::@BigSub_14<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %4 = struct.readm %arg0[@unit] : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + %5 = struct.readm %arg0[@unit$inputs] : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %6 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = struct.readm %2[@out] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %11 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c1 to %c3 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %5[%20] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %16 : !felt.type<"babybear"> + %24 = array.read %arg2[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %5[%26] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %29 { + %36 = struct.readm %2[@borrow] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %37 = array.read %5[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %36 = array.read %4[%c0] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %37 = struct.readm %36[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %38 = array.read %5[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %39 = pod.read %38[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %4[%31] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %33 = struct.readm %32[@out] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %34 = cast.toindex %16 : !felt.type<"babybear"> + %35 = array.read %0[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %4[%c1] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %13 = struct.readm %12[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + constrain.eq %1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSub_11::@ModSub_11::@constrain(%2, %14, %15) : (!struct.type<@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = array.read %4[%arg3] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %17 = array.read %5[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSubThree_13::@ModSubThree_13::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @FpAdd_15 { + struct.def @FpAdd_15 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @add : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + struct.member @add$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + struct.member @lt : !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + struct.member @lt$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + struct.member @sub : !struct.type<@BigSub_14::@BigSub_14<[]>> + struct.member @sub$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c6 = arith.constant 6 : index + %c4 = arith.constant 4 : index + %self = struct.new : <@FpAdd_15::@FpAdd_15<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %array = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_0[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %29 = cast.toindex %25 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %28 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %40 = pod.read %pod_0[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %41 = pod.read %pod_0[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %42 = function.call @BigAdd_4::@BigAdd_4::@compute(%40, %41) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> + pod.write %pod[@comp] = %42 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + %33 = cast.toindex %25 : !felt.type<"babybear"> + %34 = array.read %arg1[%33] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = pod.read %pod_0[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %36 = cast.toindex %25 : !felt.type<"babybear"> + array.write %35[%36] = %34 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %35 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %37 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %pod[@count] = %38 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %pod_0[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %41 = pod.read %pod_0[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %42 = function.call @BigAdd_4::@BigAdd_4::@compute(%40, %41) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> + pod.write %pod[@comp] = %42 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %27 = struct.readm %26[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %31 = cast.toindex %25 : !felt.type<"babybear"> + array.write %30[%31] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %30 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %pod_1[@count] = %33 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %42 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %43 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %44 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%42, %43) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %44 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + %35 = cast.toindex %25 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %38 = cast.toindex %25 : !felt.type<"babybear"> + array.write %37[%38] = %36 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %37 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %39 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.subi %39, %c1 : index + pod.write %pod_1[@count] = %40 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.cmpi eq, %40, %c0 : index + scf.if %41 { + %42 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %43 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %44 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%42, %43) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %44 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %1 = struct.readm %0[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %2 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %3[%c2] = %2 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %3 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %4 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod_1[@count] = %5 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + %7 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %7[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %7 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %27 = struct.readm %26[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %31 = cast.toindex %25 : !felt.type<"babybear"> + array.write %30[%31] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %30 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %pod_3[@count] = %33 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %48 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %49 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %50 = function.call @BigSub_14::@BigSub_14::@compute(%48, %49) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %50 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + %35 = cast.toindex %25 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + %38 = struct.readm %37[@out] : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + %39 = cast.toindex %25 : !felt.type<"babybear"> + %40 = array.read %array[%39] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = felt.mul %38, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %36, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %44 = cast.toindex %25 : !felt.type<"babybear"> + array.write %43[%44] = %42 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %43 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %45 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %46 = arith.subi %45, %c1 : index + pod.write %pod_3[@count] = %46 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %47 = arith.cmpi eq, %46, %c0 : index + scf.if %47 { + %48 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %49 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %50 = function.call @BigSub_14::@BigSub_14::@compute(%48, %49) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %50 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + } + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %12 = struct.readm %11[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %13 = array.read %12[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %14[%c2] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %14 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %15 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod_3[@count] = %16 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigSub_14::@BigSub_14::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + %18 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %18[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %18 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigSub_14::@BigSub_14::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + %27 = struct.readm %26[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = cast.toindex %25 : !felt.type<"babybear"> + array.write %nondet[%30] = %29 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@sub$inputs] = %pod_4 : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %22 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + struct.writem %self[@sub] = %22 : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigSub_14::@BigSub_14<[]>> + struct.writem %self[@add$inputs] = %pod_0 : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + %23 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + struct.writem %self[@add] = %23 : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + struct.writem %self[@lt$inputs] = %pod_2 : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %24 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + struct.writem %self[@lt] = %24 : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + struct.writem %self[@out] = %nondet : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@FpAdd_15::@FpAdd_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@add] : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %2 = struct.readm %arg0[@add$inputs] : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@lt] : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@sub] : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigSub_14::@BigSub_14<[]>> + %6 = struct.readm %arg0[@sub$inputs] : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %array = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = cast.toindex %27 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %31 = cast.toindex %27 : !felt.type<"babybear"> + %32 = array.read %30[%31] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %27 : !felt.type<"babybear"> + %34 = array.read %arg2[%33] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = pod.read %2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %36 = cast.toindex %27 : !felt.type<"babybear"> + %37 = array.read %35[%36] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %37, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %29 = cast.toindex %27 : !felt.type<"babybear"> + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = cast.toindex %27 : !felt.type<"babybear"> + %33 = array.read %31[%32] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %27 : !felt.type<"babybear"> + %35 = array.read %array[%34] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %37 = cast.toindex %27 : !felt.type<"babybear"> + %38 = array.read %36[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %8 = array.read %7[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %10 = array.read %9[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %12 = array.read %11[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %29 = cast.toindex %27 : !felt.type<"babybear"> + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = pod.read %6[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = cast.toindex %27 : !felt.type<"babybear"> + %33 = array.read %31[%32] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %27 : !felt.type<"babybear"> + %35 = array.read %array[%34] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = struct.readm %3[@out] : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + %37 = cast.toindex %27 : !felt.type<"babybear"> + %38 = array.read %array[%37] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = felt.mul %36, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %35, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = pod.read %6[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %42 = cast.toindex %27 : !felt.type<"babybear"> + %43 = array.read %41[%42] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %13 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %14 = array.read %13[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %16 = array.read %15[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %6[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %18 = array.read %17[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = struct.readm %5[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %20 = array.read %19[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = struct.readm %5[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %29 = cast.toindex %27 : !felt.type<"babybear"> + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %27 : !felt.type<"babybear"> + %32 = array.read %0[%31] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %21 = pod.read %6[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %22 = pod.read %6[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @BigSub_14::@BigSub_14::@constrain(%5, %21, %22) : (!struct.type<@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + %23 = pod.read %2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %24 = pod.read %2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @BigAdd_4::@BigAdd_4::@constrain(%1, %23, %24) : (!struct.type<@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () + %25 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @BigLessThan_10::@BigLessThan_10::@constrain(%3, %25, %26) : (!struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Fp12Add_16 { + struct.def @Fp12Add_16 { + struct.member @out : !array.type<6,2,2 x !felt.type<"babybear">> {llzk.pub} + struct.member @adders : !array.type<6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> + struct.member @adders$inputs : !array.type<6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<6,2,2 x !felt.type<"babybear">>, %arg1: !array.type<6,2,2 x !felt.type<"babybear">>) -> !struct.type<@Fp12Add_16::@Fp12Add_16<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@Fp12Add_16::@Fp12Add_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6,2,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %array[%arg2, %arg3] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3] = %3 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %arg0[%6, %7, %8] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%10, %11] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %12[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %9 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %array_0[%15, %16] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %17[@a] = %13 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%18, %19] = %17 : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %array[%20, %21] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %23 = pod.read %22[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %22[@count] = %24 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %46 = pod.read %17[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %17[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @FpAdd_15::@FpAdd_15::@compute(%46, %47) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %22[@comp] = %48 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50] = %22 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %26 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %arg1[%26, %27, %28] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_0[%30, %31] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %32[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34] = %29 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %array_0[%35, %36] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %37[@b] = %33 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %39 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%38, %39] = %37 : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %42 = array.read %array[%40, %41] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.subi %43, %c1 {product_source = "compute"} : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %45 = arith.cmpi eq, %44, %c0 {product_source = "compute"} : index + scf.if %45 { + %46 = pod.read %37[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %47 = pod.read %37[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %48 = function.call @FpAdd_15::@FpAdd_15::@compute(%46, %47) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %42[@comp] = %48 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %49 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %50 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%49, %50] = %42 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %array[%6, %7] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %9 = pod.read %8[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13, %14, %15] = %12 : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders$inputs] = %array_0 : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %array[%arg2, %arg3] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + array.write %array_2[%arg2, %arg3] = %4 : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders] = %array_2 : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@adders] : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@adders$inputs] : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %array_3 = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg0[%6, %7, %8] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %2[%10, %11] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg1[%16, %17, %18] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %2[%20, %21] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = pod.read %22[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%6, %7] : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %9 = struct.readm %8[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%12, %13, %14] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg2, %arg3] : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2, %arg3] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @FpAdd_15::@FpAdd_15::@constrain(%3, %5, %6) : (!struct.type<@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Fp12Add_16::@Fp12Add_16<[]>> + } + function.def @compute(%arg0: !array.type<6,2,2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<6,2,2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@Fp12Add_16::@Fp12Add_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@Fp12Add_16::@Fp12Add_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6,2,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg2, %arg3] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2, %arg3] = %0 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%3, %4, %5] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_0[%7, %8] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %9[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %10[%11] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %array_0[%12, %13] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %14[@a] = %10 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%15, %16] = %14 : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %array[%17, %18] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %43 = pod.read %14[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %14[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @FpAdd_15::@FpAdd_15::@compute(%43, %44) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %19[@comp] = %45 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %46 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46, %47] = %19 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %23 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %26 = array.read %arg1[%23, %24, %25] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %29 = array.read %array_0[%27, %28] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %29[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %30[%31] = %26 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %array_0[%32, %33] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %34[@b] = %30 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %35 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%35, %36] = %34 : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %37 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %38 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %array[%37, %38] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %40 = pod.read %39[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %39[@count] = %41 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %43 = pod.read %34[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %34[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @FpAdd_15::@FpAdd_15::@compute(%43, %44) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %39[@comp] = %45 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %46 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %47 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%46, %47] = %39 : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %array[%3, %4] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %7[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%10, %11, %12] = %9 : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders$inputs] = %array_0 : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c6 step %c1 { + scf.for %arg3 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg2, %arg3] : <6,2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + array.write %array_2[%arg2, %arg3] = %1 : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders] = %array_2 : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Fp12Add_16::@Fp12Add_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@Fp12Add_16::@Fp12Add_16<[]>>, %arg1: !array.type<6,2,2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<6,2,2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %c6 = arith.constant {product_source = "constrain"} 6 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@adders] : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@adders$inputs] : <@Fp12Add_16::@Fp12Add_16<[]>>, !array.type<6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %array = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%6, %7, %8] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %2[%10, %11] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = pod.read %12[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg2[%16, %17, %18] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %2[%20, %21] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = pod.read %22[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg5 = %c0 to %c2 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %1[%6, %7] : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %9 = struct.readm %8[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%10] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%12, %13, %14] : <6,2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c6 step %c1 { + scf.for %arg4 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg3, %arg4] : <6,2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg3, %arg4] : <6,2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @FpAdd_15::@FpAdd_15::@constrain(%3, %5, %6) : (!struct.type<@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_fp2_add_22.llzk b/examples/circom-demo/test_fp2_add_22.llzk new file mode 100644 index 0000000..60125e0 --- /dev/null +++ b/examples/circom-demo/test_fp2_add_22.llzk @@ -0,0 +1,2375 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Fp2Add_16::@Fp2Add_16<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSum_1 { + struct.def @ModSum_1 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSum_1::@ModSum_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSum_1::@ModSum_1<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %11 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %12 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%11) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %5 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %6 = array.read %5[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@carry] = %6 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %7 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.sub %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %9 : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %10 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %10 : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@ModSum_1::@ModSum_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSum_1::@ModSum_1<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSum_1::@ModSum_1<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSum_1::@ModSum_1<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %1, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.sub %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c4 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c4 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @ModSumThree_3 { + struct.def @ModSumThree_3 { + struct.member @sum : !felt.type<"babybear"> {llzk.pub} + struct.member @carry : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@ModSumThree_3::@ModSumThree_3<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.add %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %18 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %6 = struct.readm %5[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %7 = array.read %6[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %9 = struct.readm %8[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@carry] = %12 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %13 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %12, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@sum] = %16 : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %17 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.writem %self[@n2b] = %17 : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + function.return %self : !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@n2b] : <@ModSumThree_3::@ModSumThree_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %3 = struct.readm %arg0[@n2b$inputs] : <@ModSumThree_3::@ModSumThree_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %4, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %8 = array.read %7[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = struct.readm %2[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %10 = array.read %9[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %8, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %1, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %13, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%2, %17) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @BigAdd_4 { + struct.def @BigAdd_4 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + struct.member @unit$inputs : !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigAdd_4::@BigAdd_4<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %array = array.new : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>> + %0 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%c0] = %0 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %array_1 = array.new : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %1 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.subi %2, %c1 : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.cmpi eq, %3, %c0 : index + scf.if %4 { + %17 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSum_1::@ModSum_1::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + } + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %5 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %17 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = function.call @ModSum_1::@ModSum_1::@compute(%17, %18) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSum_1::@ModSum_1<[]>> + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + } + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + %10 = struct.readm %9[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %17 = bool.cmp lt(%arg2, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) + } do { + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %18[@a] = %17 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %18 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %19 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %20 = pod.read %19[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %19[@count] = %21 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %39 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %18[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %18[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + pod.write %19[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array[%c0] = %19 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + } + %23 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %24[@b] = %23 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %24 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %25 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %26 = pod.read %25[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.subi %26, %c1 : index + pod.write %25[@count] = %27 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.cmpi eq, %27, %c0 : index + scf.if %28 { + %39 = pod.read %24[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %24[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %24[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + pod.write %25[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array[%c0] = %25 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + } + %29 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + %30 = struct.readm %29[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %31 = array.read %array_1[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %31[@c] = %30 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %31 : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %32 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %33 = pod.read %32[@count] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.subi %33, %c1 : index + pod.write %32[@count] = %34 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, index + %35 = arith.cmpi eq, %34, %c0 : index + scf.if %35 { + %39 = pod.read %31[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %40 = pod.read %31[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %41 = pod.read %31[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %42 = function.call @ModSumThree_3::@ModSumThree_3::@compute(%39, %40, %41) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + pod.write %32[@comp] = %42 : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array[%c0] = %32 : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + } + %36 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %37 = pod.read %36[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %38 = struct.readm %37[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + array.write %nondet[%c1] = %38 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %12 = pod.read %11[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %13 = struct.readm %12[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + array.write %nondet[%c2] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@unit$inputs] = %array_1 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + %14 = array.read %array[%c0] : <1 x !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + array.write %array_2[%c0] = %15 : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + struct.writem %self[@unit] = %array_2 : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSum_1::@ModSum_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.writem %self[@unit0] = %16 : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> + struct.writem %self[@out] = %nondet : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@unit0] : <@BigAdd_4::@BigAdd_4<[]>>, !struct.type<@ModSum_1::@ModSum_1<[]>> + %2 = struct.readm %arg0[@unit0$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %3 = struct.readm %arg0[@unit] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>> + %4 = struct.readm %arg0[@unit$inputs] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %5 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = struct.readm %1[@sum] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %10 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> () { + %21 = bool.cmp lt(%arg3, %felt_const_2) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%21) + } do { + %21 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %23 = pod.read %22[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %26 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %26, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = struct.readm %1[@carry] : <@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear"> + %28 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %29 = pod.read %28[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %29, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %3[%c0] : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %31 = struct.readm %30[@sum] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %32 = array.read %0[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_2 : !felt.type<"babybear"> + } + %11 = array.read %3[%c0] : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %12 = struct.readm %11[@carry] : <@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear"> + %13 = array.read %0[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %3[%c0] : <1 x !struct.type<@ModSumThree_3::@ModSumThree_3<[]>>>, !struct.type<@ModSumThree_3::@ModSumThree_3<[]>> + %15 = array.read %4[%c0] : <1 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %18 = pod.read %15[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSumThree_3::@ModSumThree_3::@constrain(%14, %16, %17, %18) : (!struct.type<@ModSumThree_3::@ModSumThree_3<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + %19 = pod.read %2[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %2[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSum_1::@ModSum_1::@constrain(%1, %19, %20) : (!struct.type<@ModSum_1::@ModSum_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @LessThan_5 { + struct.def @LessThan_5 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_5::@LessThan_5<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_5::@LessThan_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_5::@LessThan_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + function.return %self : !struct.type<@LessThan_5::@LessThan_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_5::@LessThan_5<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_5::@LessThan_5<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_5::@LessThan_5<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<3 x !felt.type<"babybear">> + %9 = array.read %8[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%1, %11) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @IsZero_6 { + struct.def @IsZero_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @inv : !felt.type<"babybear"> + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@IsZero_6::@IsZero_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@IsZero_6::@IsZero_6<[]>> + %0 = bool.cmp ne(%arg0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = scf.if %0 -> (!felt.type<"babybear">) { + %5 = felt.div %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@inv] = %5 : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } else { + struct.writem %self[@inv] = %felt_const_0 : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + scf.yield %felt_const_0 : !felt.type<"babybear"> + } + %2 = felt.neg %arg0 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %4 : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@IsZero_6::@IsZero_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsZero_6::@IsZero_6<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@inv] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + %2 = felt.neg %arg1 : !felt.type<"babybear"> + %3 = felt.mul %2, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.mul %arg1, %0 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @IsEqual_7 { + struct.def @IsEqual_7 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @isz : !struct.type<@IsZero_6::@IsZero_6<[]>> + struct.member @isz$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_7::@IsEqual_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %self = struct.new : <@IsEqual_7::@IsEqual_7<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + %0 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %2 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %3 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, index + %4 = arith.subi %3, %c1 : index + pod.write %pod[@count] = %4 : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.cmpi eq, %4, %c0 : index + scf.if %5 { + %9 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %10 = function.call @IsZero_6::@IsZero_6::@compute(%9) : (!felt.type<"babybear">) -> !struct.type<@IsZero_6::@IsZero_6<[]>> + pod.write %pod[@comp] = %10 : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_6::@IsZero_6<[]>> + } + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_6::@IsZero_6<[]>> + %7 = struct.readm %6[@out] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %7 : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + struct.writem %self[@isz$inputs] = %pod_0 : <@IsEqual_7::@IsEqual_7<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@IsZero_6::@IsZero_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsZero_6::@IsZero_6<[]>> + struct.writem %self[@isz] = %8 : <@IsEqual_7::@IsEqual_7<[]>>, !struct.type<@IsZero_6::@IsZero_6<[]>> + function.return %self : !struct.type<@IsEqual_7::@IsEqual_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %0 = struct.readm %arg0[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@isz] : <@IsEqual_7::@IsEqual_7<[]>>, !struct.type<@IsZero_6::@IsZero_6<[]>> + %2 = struct.readm %arg0[@isz$inputs] : <@IsEqual_7::@IsEqual_7<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %3 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = struct.readm %1[@out] : <@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @IsZero_6::@IsZero_6::@constrain(%1, %8) : (!struct.type<@IsZero_6::@IsZero_6<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @AND_8 { + struct.def @AND_8 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@AND_8::@AND_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@AND_8::@AND_8<[]>> + %0 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %0 : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@AND_8::@AND_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@AND_8::@AND_8<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %1 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OR_9 { + struct.def @OR_9 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@OR_9::@OR_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_9::@OR_9<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_9::@OR_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_9::@OR_9<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigLessThan_10 { + struct.def @BigLessThan_10 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !array.type<3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + struct.member @lt$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @eq_ands : !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.member @eq_ands$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @eq : !array.type<3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + struct.member @eq$inputs : !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + struct.member @ors : !array.type<2 x !struct.type<@OR_9::@OR_9<[]>>> + struct.member @ors$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + struct.member @ands : !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.member @ands$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@BigLessThan_10::@BigLessThan_10<[]>> + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %4 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_1 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_1[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array_1[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %array_2 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_3 = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + array.write %array_3[%arg2] = %4 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + } + %array_4 = array.new : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_5 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + array.write %array_5[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + %array_6 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_7 = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + pod.write %4[@count] = %c2 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + array.write %array_7[%arg2] = %4 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %array_8 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %array_0[%7] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %9 = pod.read %8[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c0] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %4 : !felt.type<"babybear"> + %11 = array.read %array_0[%10] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %11[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %12 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_0[%12] = %11 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = cast.toindex %4 : !felt.type<"babybear"> + %14 = array.read %array[%13] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %14[@count] = %16 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %57 = pod.read %11[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @LessThan_5::@LessThan_5::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %14[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array[%59] = %14 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + } + %18 = cast.toindex %4 : !felt.type<"babybear"> + %19 = array.read %arg1[%18] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = cast.toindex %4 : !felt.type<"babybear"> + %21 = array.read %array_0[%20] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %22 = pod.read %21[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %22[%c1] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %4 : !felt.type<"babybear"> + %24 = array.read %array_0[%23] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %24[@in] = %22 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %25 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_0[%25] = %24 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %26 = cast.toindex %4 : !felt.type<"babybear"> + %27 = array.read %array[%26] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %28 = pod.read %27[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.subi %28, %c1 : index + pod.write %27[@count] = %29 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %30 = arith.cmpi eq, %29, %c0 : index + scf.if %30 { + %57 = pod.read %24[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @LessThan_5::@LessThan_5::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %27[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array[%59] = %27 : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + } + %31 = cast.toindex %4 : !felt.type<"babybear"> + %32 = array.read %arg0[%31] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = cast.toindex %4 : !felt.type<"babybear"> + %34 = array.read %array_4[%33] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %35 = pod.read %34[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %35[%c0] = %32 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = cast.toindex %4 : !felt.type<"babybear"> + %37 = array.read %array_4[%36] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %37[@in] = %35 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %38 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_4[%38] = %37 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %39 = cast.toindex %4 : !felt.type<"babybear"> + %40 = array.read %array_3[%39] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %41 = pod.read %40[@count] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %42 = arith.subi %41, %c1 : index + pod.write %40[@count] = %42 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %43 = arith.cmpi eq, %42, %c0 : index + scf.if %43 { + %57 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @IsEqual_7::@IsEqual_7::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_7::@IsEqual_7<[]>> + pod.write %40[@comp] = %58 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_3[%59] = %40 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + } + %44 = cast.toindex %4 : !felt.type<"babybear"> + %45 = array.read %arg1[%44] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = cast.toindex %4 : !felt.type<"babybear"> + %47 = array.read %array_4[%46] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %48 = pod.read %47[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %48[%c1] = %45 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = cast.toindex %4 : !felt.type<"babybear"> + %50 = array.read %array_4[%49] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + pod.write %50[@in] = %48 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %51 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_4[%51] = %50 : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %52 = cast.toindex %4 : !felt.type<"babybear"> + %53 = array.read %array_3[%52] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %54 = pod.read %53[@count] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %55 = arith.subi %54, %c1 : index + pod.write %53[@count] = %55 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, index + %56 = arith.cmpi eq, %55, %c0 : index + scf.if %56 { + %57 = pod.read %50[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %58 = function.call @IsEqual_7::@IsEqual_7::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@IsEqual_7::@IsEqual_7<[]>> + pod.write %53[@comp] = %58 : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %59 = cast.toindex %4 : !felt.type<"babybear"> + array.write %array_3[%59] = %53 : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + } + } + %0 = scf.while (%arg2 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %4 = bool.cmp ge(%arg2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%4) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %4 = bool.cmp eq(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %4 { + %6 = array.read %array_3[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %8 = struct.readm %7[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %9 = array.read %array_8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %9[@a] = %8 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_8[%c1] = %9 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %10 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %54 = pod.read %9[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %9[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %10[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_7[%c1] = %10 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %14 = array.read %array[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %16 = struct.readm %15[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %17 = array.read %array_8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %17[@b] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_8[%c1] = %17 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %18 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %54 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %18[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_7[%c1] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %22 = array.read %array_3[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %24 = struct.readm %23[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %25 = array.read %array_2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %25[@a] = %24 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c1] = %25 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %26 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %54 = pod.read %25[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %26[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c1] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %30 = array.read %array_3[%c1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %32 = struct.readm %31[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %33 = array.read %array_2[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %33[@b] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c1] = %33 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %34 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %36 = arith.subi %35, %c1 : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.cmpi eq, %36, %c0 : index + scf.if %37 { + %54 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %34[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c1] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %38 = array.read %array[%c2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %40 = struct.readm %39[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %41 = array.read %array_6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %41[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c1] = %41 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %42 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %44 = arith.subi %43, %c1 : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %45 = arith.cmpi eq, %44, %c0 : index + scf.if %45 { + %54 = pod.read %41[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %42[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_5[%c1] = %42 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + %46 = array.read %array_7[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %47 = pod.read %46[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %48 = struct.readm %47[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %49 = array.read %array_6[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %49[@b] = %48 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c1] = %49 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %50 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %52 = arith.subi %51, %c1 : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.cmpi eq, %52, %c0 : index + scf.if %53 { + %54 = pod.read %49[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %49[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %50[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_5[%c1] = %50 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + } else { + %6 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %8 = struct.readm %7[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %9 = array.read %array_8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %9[@a] = %8 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_8[%c0] = %9 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %10 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %10[@count] = %12 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %54 = pod.read %9[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %9[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %10[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_7[%c0] = %10 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %14 = array.read %array[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %16 = struct.readm %15[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %17 = array.read %array_8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %17[@b] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_8[%c0] = %17 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %18 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %19 = pod.read %18[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %18[@count] = %20 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %54 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %18[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_7[%c0] = %18 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %22 = array.read %array_1[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %23 = pod.read %22[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %24 = struct.readm %23[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %25 = array.read %array_2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %25[@a] = %24 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c0] = %25 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %26 = array.read %array_1[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %27 = pod.read %26[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %28 = arith.subi %27, %c1 : index + pod.write %26[@count] = %28 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %29 = arith.cmpi eq, %28, %c0 : index + scf.if %29 { + %54 = pod.read %25[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %25[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %26[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c0] = %26 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %30 = array.read %array_3[%c0] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %31 = pod.read %30[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %32 = struct.readm %31[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %33 = array.read %array_2[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %33[@b] = %32 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_2[%c0] = %33 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %34 = array.read %array_1[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %35 = pod.read %34[@count] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %36 = arith.subi %35, %c1 : index + pod.write %34[@count] = %36 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, index + %37 = arith.cmpi eq, %36, %c0 : index + scf.if %37 { + %54 = pod.read %33[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %33[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @AND_8::@AND_8::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@AND_8::@AND_8<[]>> + pod.write %34[@comp] = %56 : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_1[%c0] = %34 : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + } + %38 = array.read %array_5[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %39 = pod.read %38[@comp] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + %40 = struct.readm %39[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + %41 = array.read %array_6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %41[@a] = %40 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c0] = %41 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %42 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %43 = pod.read %42[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %44 = arith.subi %43, %c1 : index + pod.write %42[@count] = %44 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %45 = arith.cmpi eq, %44, %c0 : index + scf.if %45 { + %54 = pod.read %41[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %41[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %42[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_5[%c0] = %42 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + %46 = array.read %array_7[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %47 = pod.read %46[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + %48 = struct.readm %47[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %49 = array.read %array_6[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %49[@b] = %48 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_6[%c0] = %49 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %50 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %51 = pod.read %50[@count] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %52 = arith.subi %51, %c1 : index + pod.write %50[@count] = %52 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.cmpi eq, %52, %c0 : index + scf.if %53 { + %54 = pod.read %49[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %55 = pod.read %49[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = function.call @OR_9::@OR_9::@compute(%54, %55) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_9::@OR_9<[]>> + pod.write %50[@comp] = %56 : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_5[%c0] = %50 : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + } + } + %5 = felt.sub %arg2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %5 : !felt.type<"babybear"> + } + %1 = array.read %array_5[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %2 = pod.read %1[@comp] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + %3 = struct.readm %2[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + struct.writem %self[@ands$inputs] = %array_8 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_9 = array.new : <2 x !struct.type<@AND_8::@AND_8<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_7[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_9[%arg2] = %5 : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + } + struct.writem %self[@ands] = %array_9 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.writem %self[@ors$inputs] = %array_6 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_10 = array.new : <2 x !struct.type<@OR_9::@OR_9<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_5[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@OR_9::@OR_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_9::@OR_9<[]>> + array.write %array_10[%arg2] = %5 : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + } + struct.writem %self[@ors] = %array_10 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@OR_9::@OR_9<[]>>> + struct.writem %self[@eq$inputs] = %array_4 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_11 = array.new : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array_3[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@IsEqual_7::@IsEqual_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + array.write %array_11[%arg2] = %5 : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + } + struct.writem %self[@eq] = %array_11 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + struct.writem %self[@eq_ands$inputs] = %array_2 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_12 = array.new : <2 x !struct.type<@AND_8::@AND_8<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = array.read %array_1[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@AND_8::@AND_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@AND_8::@AND_8<[]>> + array.write %array_12[%arg2] = %5 : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + } + struct.writem %self[@eq_ands] = %array_12 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + struct.writem %self[@lt$inputs] = %array_0 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %array_13 = array.new : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = array.read %array[%arg2] : <3 x !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %5 = pod.read %4[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + array.write %array_13[%arg2] = %5 : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + } + struct.writem %self[@lt] = %array_13 : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + function.return %self : !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@lt] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@LessThan_5::@LessThan_5<[]>>> + %2 = struct.readm %arg0[@lt$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %3 = struct.readm %arg0[@eq_ands] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + %4 = struct.readm %arg0[@eq_ands$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %5 = struct.readm %arg0[@eq] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>> + %6 = struct.readm %arg0[@eq$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>> + %7 = struct.readm %arg0[@ors] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@OR_9::@OR_9<[]>>> + %8 = struct.readm %arg0[@ors$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %9 = struct.readm %arg0[@ands] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !struct.type<@AND_8::@AND_8<[]>>> + %10 = struct.readm %arg0[@ands$inputs] : <@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg1[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = cast.toindex %14 : !felt.type<"babybear"> + %18 = array.read %2[%17] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %19 = pod.read %18[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = array.read %19[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg2[%21] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %14 : !felt.type<"babybear"> + %24 = array.read %2[%23] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %25 = pod.read %24[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %26 = array.read %25[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = cast.toindex %14 : !felt.type<"babybear"> + %28 = array.read %arg1[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = cast.toindex %14 : !felt.type<"babybear"> + %30 = array.read %6[%29] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %31 = pod.read %30[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %32 = array.read %31[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %14 : !felt.type<"babybear"> + %34 = array.read %arg2[%33] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = cast.toindex %14 : !felt.type<"babybear"> + %36 = array.read %6[%35] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %37 = pod.read %36[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %38 = array.read %37[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %11 = scf.while (%arg3 = %felt_const_1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %14 = bool.cmp ge(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%14) %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg3: !felt.type<"babybear">): + %14 = bool.cmp eq(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %14 { + %16 = array.read %5[%c2] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %17 = struct.readm %16[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %18 = array.read %10[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %1[%c1] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %21 = struct.readm %20[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %22 = array.read %10[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %23 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %5[%c2] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %25 = struct.readm %24[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %26 = array.read %4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %27 = pod.read %26[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = array.read %5[%c1] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %29 = struct.readm %28[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %30 = array.read %4[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %31 = pod.read %30[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %1[%c2] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %33 = struct.readm %32[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %34 = array.read %8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %35 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = array.read %9[%c1] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %37 = struct.readm %36[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %38 = array.read %8[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %39 = pod.read %38[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %16 = array.read %3[%c1] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %17 = struct.readm %16[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %18 = array.read %10[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %19 = pod.read %18[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %1[%c0] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %21 = struct.readm %20[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + %22 = array.read %10[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %23 = pod.read %22[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %3[%c1] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %25 = struct.readm %24[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %26 = array.read %4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %27 = pod.read %26[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %27, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = array.read %5[%c0] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %29 = struct.readm %28[@out] : <@IsEqual_7::@IsEqual_7<[]>>, !felt.type<"babybear"> + %30 = array.read %4[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %31 = pod.read %30[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %7[%c1] : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + %33 = struct.readm %32[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + %34 = array.read %8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %35 = pod.read %34[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = array.read %9[%c0] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %37 = struct.readm %36[@out] : <@AND_8::@AND_8<[]>>, !felt.type<"babybear"> + %38 = array.read %8[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %39 = pod.read %38[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %15 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %15 : !felt.type<"babybear"> + } + %12 = array.read %7[%c0] : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + %13 = struct.readm %12[@out] : <@OR_9::@OR_9<[]>>, !felt.type<"babybear"> + constrain.eq %0, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %9[%arg3] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %15 = array.read %10[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_8::@AND_8::@constrain(%14, %16, %17) : (!struct.type<@AND_8::@AND_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %7[%arg3] : <2 x !struct.type<@OR_9::@OR_9<[]>>>, !struct.type<@OR_9::@OR_9<[]>> + %15 = array.read %8[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_9::@OR_9::@constrain(%14, %16, %17) : (!struct.type<@OR_9::@OR_9<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = array.read %5[%arg3] : <3 x !struct.type<@IsEqual_7::@IsEqual_7<[]>>>, !struct.type<@IsEqual_7::@IsEqual_7<[]>> + %15 = array.read %6[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @IsEqual_7::@IsEqual_7::@constrain(%14, %16) : (!struct.type<@IsEqual_7::@IsEqual_7<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %14 = array.read %3[%arg3] : <2 x !struct.type<@AND_8::@AND_8<[]>>>, !struct.type<@AND_8::@AND_8<[]>> + %15 = array.read %4[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = pod.read %15[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = pod.read %15[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @AND_8::@AND_8::@constrain(%14, %16, %17) : (!struct.type<@AND_8::@AND_8<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %14 = array.read %1[%arg3] : <3 x !struct.type<@LessThan_5::@LessThan_5<[]>>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %15 = array.read %2[%arg3] : <3 x !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %16 = pod.read %15[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_5::@LessThan_5::@constrain(%14, %16) : (!struct.type<@LessThan_5::@LessThan_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + } + function.return + } + } + } + poly.template @ModSub_11 { + struct.def @ModSub_11 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_5::@LessThan_5<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}) -> !struct.type<@ModSub_11::@ModSub_11<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSub_11::@ModSub_11<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %0[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_5::@LessThan_5::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + } + %4 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %4[%c1] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %4 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %15 = function.call @LessThan_5::@LessThan_5::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_5::@LessThan_5<[]>> + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %9 = struct.readm %8[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %9 : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %10 = felt.mul %9, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %10, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %12 : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSub_11::@ModSub_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_5::@LessThan_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_5::@LessThan_5<[]>> + struct.writem %self[@lt] = %13 : <@ModSub_11::@ModSub_11<[]>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + function.return %self : !struct.type<@ModSub_11::@ModSub_11<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSub_11::@ModSub_11<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@lt] : <@ModSub_11::@ModSub_11<[]>>, !struct.type<@LessThan_5::@LessThan_5<[]>> + %3 = struct.readm %arg0[@lt$inputs] : <@ModSub_11::@ModSub_11<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %4 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %7 = array.read %6[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %2[@out] : <@LessThan_5::@LessThan_5<[]>>, !felt.type<"babybear"> + constrain.eq %1, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %9, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.sub %10, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %3[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_5::@LessThan_5::@constrain(%2, %12) : (!struct.type<@LessThan_5::@LessThan_5<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @LessThan_12 { + struct.def @LessThan_12 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_12::@LessThan_12<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %c1 = arith.constant 1 : index + %self = struct.new : <@LessThan_12::@LessThan_12<[]>> + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %13 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %8 = struct.readm %7[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %10 : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_12::@LessThan_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.writem %self[@n2b] = %11 : <@LessThan_12::@LessThan_12<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + function.return %self : !struct.type<@LessThan_12::@LessThan_12<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_12::@LessThan_12<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_8 = felt.const 8 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@n2b] : <@LessThan_12::@LessThan_12<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_12::@LessThan_12<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + bool.assert %true, "assertion failed" + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_8 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = struct.readm %1[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<4 x !felt.type<"babybear">> + %9 = array.read %8[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%1, %11) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @ModSubThree_13 { + struct.def @ModSubThree_13 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @borrow : !felt.type<"babybear"> {llzk.pub} + struct.member @bplusc : !felt.type<"babybear"> + struct.member @lt : !struct.type<@LessThan_12::@LessThan_12<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !felt.type<"babybear"> {llzk.pub}, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %c2 = arith.constant 2 : index + %self = struct.new : <@ModSubThree_13::@ModSubThree_13<[]>> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %0 = felt.sub %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %0, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %3, "assertion failed" + %4 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@bplusc] = %4 : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %5 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %5[%c0] = %arg0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %5 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_12::@LessThan_12::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_12::@LessThan_12<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + } + %9 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + array.write %9[%c1] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %9 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %20 = function.call @LessThan_12::@LessThan_12::@compute(%19) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_12::@LessThan_12<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + } + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + %14 = struct.readm %13[@out] : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + struct.writem %self[@borrow] = %14 : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %17 : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + struct.writem %self[@lt$inputs] = %pod_0 : <@ModSubThree_13::@ModSubThree_13<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + %18 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_12::@LessThan_12<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_12::@LessThan_12<[]>> + struct.writem %self[@lt] = %18 : <@ModSubThree_13::@ModSubThree_13<[]>>, !struct.type<@LessThan_12::@LessThan_12<[]>> + function.return %self : !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + } + function.def @constrain(%arg0: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, %arg1: !felt.type<"babybear"> {llzk.pub}, %arg2: !felt.type<"babybear"> {llzk.pub}, %arg3: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@bplusc] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %3 = struct.readm %arg0[@lt] : <@ModSubThree_13::@ModSubThree_13<[]>>, !struct.type<@LessThan_12::@LessThan_12<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@ModSubThree_13::@ModSubThree_13<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + bool.assert %true, "assertion failed" + %5 = felt.sub %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.sub %5, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = bool.cmp ge(%7, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + bool.assert %8, "assertion failed" + %9 = felt.add %arg2, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %2, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = array.read %10[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %13 = array.read %12[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = struct.readm %3[@out] : <@LessThan_12::@LessThan_12<[]>>, !felt.type<"babybear"> + constrain.eq %1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.mul %1, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %15, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %16, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = pod.read %4[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @LessThan_12::@LessThan_12::@constrain(%3, %18) : (!struct.type<@LessThan_12::@LessThan_12<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @BigSub_14 { + struct.def @BigSub_14 { + struct.member @out : !array.type<3 x !felt.type<"babybear">> {llzk.pub} + struct.member @underflow : !felt.type<"babybear"> {llzk.pub} + struct.member @unit0 : !struct.type<@ModSub_11::@ModSub_11<[]>> + struct.member @unit0$inputs : !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + struct.member @unit : !array.type<2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + struct.member @unit$inputs : !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@BigSub_14::@BigSub_14<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %true = arith.constant true + %felt_const_1 = felt.const 1 : <"babybear"> + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %self = struct.new : <@BigSub_14::@BigSub_14<[]>> + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + pod.write %14[@count] = %c3 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %14 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + %array_1 = array.new : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %0 = array.read %arg0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %0 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSub_11::@ModSub_11::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_11::@ModSub_11<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + } + %4 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %4 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.subi %5, %c1 : index + pod.write %pod[@count] = %6 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.cmpi eq, %6, %c0 : index + scf.if %7 { + %14 = pod.read %pod_0[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %16 = function.call @ModSub_11::@ModSub_11::@compute(%14, %15) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSub_11::@ModSub_11<[]>> + pod.write %pod[@comp] = %16 : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + } + %8 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + %9 = struct.readm %8[@out] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + array.write %nondet[%c0] = %9 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c1 to %c3 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg0[%15] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %array_1[%18] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %19[@a] = %16 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + array.write %array_1[%21] = %19 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %22 : !felt.type<"babybear"> + %24 = array.read %array[%23] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %25 = pod.read %24[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %26 = arith.subi %25, %c1 : index + pod.write %24[@count] = %26 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %27 = arith.cmpi eq, %26, %c0 : index + scf.if %27 { + %48 = pod.read %19[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %19[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %19[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %24[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %24 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %array_1[%31] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %32[@b] = %29 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %33 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %33 : !felt.type<"babybear"> + array.write %array_1[%34] = %32 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %35 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %36 = cast.toindex %35 : !felt.type<"babybear"> + %37 = array.read %array[%36] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %38 = pod.read %37[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.subi %38, %c1 : index + pod.write %37[@count] = %39 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.cmpi eq, %39, %c0 : index + scf.if %40 { + %48 = pod.read %32[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %49 = pod.read %32[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %50 = pod.read %32[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %51 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%48, %49, %50) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %37[@comp] = %51 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %52 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = cast.toindex %52 : !felt.type<"babybear"> + array.write %array[%53] = %37 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + %41 = bool.cmp eq(%14, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %41 { + %48 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + %49 = struct.readm %48[@borrow] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %50 = array.read %array_1[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %50[@c] = %49 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c0] = %50 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %51 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %52 = pod.read %51[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %53 = arith.subi %52, %c1 : index + pod.write %51[@count] = %53 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %54 = arith.cmpi eq, %53, %c0 : index + scf.if %54 { + %55 = pod.read %50[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %56 = pod.read %50[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %57 = pod.read %50[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %58 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%55, %56, %57) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %51[@comp] = %58 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + array.write %array[%c0] = %51 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + } else { + %48 = array.read %array[%c0] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %49 = pod.read %48[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %50 = struct.readm %49[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %51 = array.read %array_1[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + pod.write %51[@c] = %50 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + array.write %array_1[%c1] = %51 : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %52 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %53 = pod.read %52[@count] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %54 = arith.subi %53, %c1 : index + pod.write %52[@count] = %54 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, index + %55 = arith.cmpi eq, %54, %c0 : index + scf.if %55 { + %56 = pod.read %51[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %57 = pod.read %51[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %58 = pod.read %51[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %59 = function.call @ModSubThree_13::@ModSubThree_13::@compute(%56, %57, %58) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + pod.write %52[@comp] = %59 : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + array.write %array[%c1] = %52 : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + } + } + %42 = felt.sub %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = cast.toindex %42 : !felt.type<"babybear"> + %44 = array.read %array[%43] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %45 = pod.read %44[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %46 = struct.readm %45[@out] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %47 = cast.toindex %14 : !felt.type<"babybear"> + array.write %nondet[%47] = %46 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %10 = array.read %array[%c1] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %11 = pod.read %10[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %12 = struct.readm %11[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + struct.writem %self[@underflow] = %12 : <@BigSub_14::@BigSub_14<[]>>, !felt.type<"babybear"> + struct.writem %self[@unit0$inputs] = %pod_0 : <@BigSub_14::@BigSub_14<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@ModSub_11::@ModSub_11<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSub_11::@ModSub_11<[]>> + struct.writem %self[@unit0] = %13 : <@BigSub_14::@BigSub_14<[]>>, !struct.type<@ModSub_11::@ModSub_11<[]>> + struct.writem %self[@unit$inputs] = %array_1 : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + %array_2 = array.new : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + scf.for %arg2 = %c0 to %c2 step %c1 { + %14 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]> + %15 = pod.read %14[@comp] : <[@count: index, @comp: !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, @params: !pod.type<[]>]>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + array.write %array_2[%arg2] = %15 : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + } + struct.writem %self[@unit] = %array_2 : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + struct.writem %self[@out] = %nondet : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigSub_14::@BigSub_14<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigSub_14::@BigSub_14<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<3 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %true = arith.constant true + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c2 = arith.constant 2 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@underflow] : <@BigSub_14::@BigSub_14<[]>>, !felt.type<"babybear"> + %2 = struct.readm %arg0[@unit0] : <@BigSub_14::@BigSub_14<[]>>, !struct.type<@ModSub_11::@ModSub_11<[]>> + %3 = struct.readm %arg0[@unit0$inputs] : <@BigSub_14::@BigSub_14<[]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %4 = struct.readm %arg0[@unit] : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>> + %5 = struct.readm %arg0[@unit$inputs] : <@BigSub_14::@BigSub_14<[]>>, !array.type<2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>> + bool.assert %true, "assertion failed" + %6 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = struct.readm %2[@out] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %11 = array.read %0[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %11, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c1 to %c3 step %c1 { + %16 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %arg1[%17] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %5[%20] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %22 = pod.read %21[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %22, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %16 : !felt.type<"babybear"> + %24 = array.read %arg2[%23] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %5[%26] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %28 = pod.read %27[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %28, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = bool.cmp eq(%16, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %29 { + %36 = struct.readm %2[@borrow] : <@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear"> + %37 = array.read %5[%c0] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %38 = pod.read %37[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %38, %36 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %36 = array.read %4[%c0] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %37 = struct.readm %36[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %38 = array.read %5[%c1] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %39 = pod.read %38[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %39, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %30 = felt.sub %16, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %30 : !felt.type<"babybear"> + %32 = array.read %4[%31] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %33 = struct.readm %32[@out] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + %34 = cast.toindex %16 : !felt.type<"babybear"> + %35 = array.read %0[%34] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %35, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = array.read %4[%c1] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %13 = struct.readm %12[@borrow] : <@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear"> + constrain.eq %1, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = pod.read %3[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = pod.read %3[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSub_11::@ModSub_11::@constrain(%2, %14, %15) : (!struct.type<@ModSub_11::@ModSub_11<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + scf.for %arg3 = %c0 to %c2 step %c1 { + %16 = array.read %4[%arg3] : <2 x !struct.type<@ModSubThree_13::@ModSubThree_13<[]>>>, !struct.type<@ModSubThree_13::@ModSubThree_13<[]>> + %17 = array.read %5[%arg3] : <2 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]> + %18 = pod.read %17[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %19 = pod.read %17[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + %20 = pod.read %17[@c] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">, @c: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @ModSubThree_13::@ModSubThree_13::@constrain(%16, %18, %19, %20) : (!struct.type<@ModSubThree_13::@ModSubThree_13<[]>>, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @FpAdd_15 { + struct.def @FpAdd_15 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + struct.member @add : !struct.type<@BigAdd_4::@BigAdd_4<[]>> + struct.member @add$inputs : !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + struct.member @lt : !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + struct.member @lt$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + struct.member @sub : !struct.type<@BigSub_14::@BigSub_14<[]>> + struct.member @sub$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %true = arith.constant true + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %c6 = arith.constant 6 : index + %c4 = arith.constant 4 : index + %self = struct.new : <@FpAdd_15::@FpAdd_15<[]>> + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %array = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = cast.toindex %25 : !felt.type<"babybear"> + %27 = array.read %arg0[%26] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = pod.read %pod_0[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %29 = cast.toindex %25 : !felt.type<"babybear"> + array.write %28[%29] = %27 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %28 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %30 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %31 = arith.subi %30, %c1 : index + pod.write %pod[@count] = %31 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %32 = arith.cmpi eq, %31, %c0 : index + scf.if %32 { + %40 = pod.read %pod_0[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %41 = pod.read %pod_0[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %42 = function.call @BigAdd_4::@BigAdd_4::@compute(%40, %41) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> + pod.write %pod[@comp] = %42 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + %33 = cast.toindex %25 : !felt.type<"babybear"> + %34 = array.read %arg1[%33] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = pod.read %pod_0[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %36 = cast.toindex %25 : !felt.type<"babybear"> + array.write %35[%36] = %34 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %35 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %37 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %38 = arith.subi %37, %c1 : index + pod.write %pod[@count] = %38 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, index + %39 = arith.cmpi eq, %38, %c0 : index + scf.if %39 { + %40 = pod.read %pod_0[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %41 = pod.read %pod_0[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %42 = function.call @BigAdd_4::@BigAdd_4::@compute(%40, %41) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@BigAdd_4::@BigAdd_4<[]>> + pod.write %pod[@comp] = %42 : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + } + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %27 = struct.readm %26[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %31 = cast.toindex %25 : !felt.type<"babybear"> + array.write %30[%31] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %30 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %pod_1[@count] = %33 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %42 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %43 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %44 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%42, %43) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %44 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + %35 = cast.toindex %25 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %38 = cast.toindex %25 : !felt.type<"babybear"> + array.write %37[%38] = %36 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %37 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %39 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %40 = arith.subi %39, %c1 : index + pod.write %pod_1[@count] = %40 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %41 = arith.cmpi eq, %40, %c0 : index + scf.if %41 { + %42 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %43 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %44 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%42, %43) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %44 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %1 = struct.readm %0[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %2 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %3[%c2] = %2 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %3 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %4 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %5 = arith.subi %4, %c1 : index + pod.write %pod_1[@count] = %5 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %6 = arith.cmpi eq, %5, %c0 : index + scf.if %6 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + %7 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %7[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %7 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigLessThan_10::@BigLessThan_10::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + pod.write %pod_1[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %27 = struct.readm %26[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %31 = cast.toindex %25 : !felt.type<"babybear"> + array.write %30[%31] = %29 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %30 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %33 = arith.subi %32, %c1 : index + pod.write %pod_3[@count] = %33 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %34 = arith.cmpi eq, %33, %c0 : index + scf.if %34 { + %48 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %49 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %50 = function.call @BigSub_14::@BigSub_14::@compute(%48, %49) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %50 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + %35 = cast.toindex %25 : !felt.type<"babybear"> + %36 = array.read %array[%35] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + %38 = struct.readm %37[@out] : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + %39 = cast.toindex %25 : !felt.type<"babybear"> + %40 = array.read %array[%39] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = felt.mul %38, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + %42 = felt.sub %36, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %44 = cast.toindex %25 : !felt.type<"babybear"> + array.write %43[%44] = %42 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %43 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %45 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %46 = arith.subi %45, %c1 : index + pod.write %pod_3[@count] = %46 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %47 = arith.cmpi eq, %46, %c0 : index + scf.if %47 { + %48 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %49 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %50 = function.call @BigSub_14::@BigSub_14::@compute(%48, %49) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %50 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + } + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %12 = struct.readm %11[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %13 = array.read %12[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %14[%c2] = %13 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %14 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %15 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod_3[@count] = %16 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigSub_14::@BigSub_14::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + %18 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + array.write %18[%c2] = %felt_const_0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %18 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %19 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.subi %19, %c1 : index + pod.write %pod_3[@count] = %20 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.cmpi eq, %20, %c0 : index + scf.if %21 { + %25 = pod.read %pod_4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %26 = pod.read %pod_4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %27 = function.call @BigSub_14::@BigSub_14::@compute(%25, %26) : (!array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@BigSub_14::@BigSub_14<[]>> + pod.write %pod_3[@comp] = %27 : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %25 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %26 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + %27 = struct.readm %26[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %28 = cast.toindex %25 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = cast.toindex %25 : !felt.type<"babybear"> + array.write %nondet[%30] = %29 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@lt$inputs] = %pod_2 : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %22 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + struct.writem %self[@lt] = %22 : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + struct.writem %self[@sub$inputs] = %pod_4 : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %23 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@BigSub_14::@BigSub_14<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigSub_14::@BigSub_14<[]>> + struct.writem %self[@sub] = %23 : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigSub_14::@BigSub_14<[]>> + struct.writem %self[@add$inputs] = %pod_0 : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigAdd_4::@BigAdd_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + struct.writem %self[@add] = %24 : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + struct.writem %self[@out] = %nondet : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> + function.return %self : !struct.type<@FpAdd_15::@FpAdd_15<[]>> + } + function.def @constrain(%arg0: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_3 = felt.const 3 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@add] : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigAdd_4::@BigAdd_4<[]>> + %2 = struct.readm %arg0[@add$inputs] : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@lt] : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigLessThan_10::@BigLessThan_10<[]>> + %4 = struct.readm %arg0[@lt$inputs] : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@sub] : <@FpAdd_15::@FpAdd_15<[]>>, !struct.type<@BigSub_14::@BigSub_14<[]>> + %6 = struct.readm %arg0[@sub$inputs] : <@FpAdd_15::@FpAdd_15<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]> + %array = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = cast.toindex %27 : !felt.type<"babybear"> + %29 = array.read %arg1[%28] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = pod.read %2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %31 = cast.toindex %27 : !felt.type<"babybear"> + %32 = array.read %30[%31] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = cast.toindex %27 : !felt.type<"babybear"> + %34 = array.read %arg2[%33] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %35 = pod.read %2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %36 = cast.toindex %27 : !felt.type<"babybear"> + %37 = array.read %35[%36] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %37, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %29 = cast.toindex %27 : !felt.type<"babybear"> + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = cast.toindex %27 : !felt.type<"babybear"> + %33 = array.read %31[%32] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %27 : !felt.type<"babybear"> + %35 = array.read %array[%34] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %37 = cast.toindex %27 : !felt.type<"babybear"> + %38 = array.read %36[%37] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %38, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %8 = array.read %7[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %10 = array.read %9[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %12 = array.read %11[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %29 = cast.toindex %27 : !felt.type<"babybear"> + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = pod.read %6[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %32 = cast.toindex %27 : !felt.type<"babybear"> + %33 = array.read %31[%32] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = cast.toindex %27 : !felt.type<"babybear"> + %35 = array.read %array[%34] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = struct.readm %3[@out] : <@BigLessThan_10::@BigLessThan_10<[]>>, !felt.type<"babybear"> + %37 = cast.toindex %27 : !felt.type<"babybear"> + %38 = array.read %array[%37] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = felt.mul %36, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = felt.sub %35, %39 : !felt.type<"babybear">, !felt.type<"babybear"> + %41 = pod.read %6[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %42 = cast.toindex %27 : !felt.type<"babybear"> + %43 = array.read %41[%42] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %43, %40 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %13 = struct.readm %1[@out] : <@BigAdd_4::@BigAdd_4<[]>>, !array.type<3 x !felt.type<"babybear">> + %14 = array.read %13[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %6[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %16 = array.read %15[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = pod.read %6[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %18 = array.read %17[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %18, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = struct.readm %5[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %20 = array.read %19[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c2 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %28 = struct.readm %5[@out] : <@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">> + %29 = cast.toindex %27 : !felt.type<"babybear"> + %30 = array.read %28[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = cast.toindex %27 : !felt.type<"babybear"> + %32 = array.read %0[%31] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %32, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %21 = pod.read %4[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %22 = pod.read %4[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @BigLessThan_10::@BigLessThan_10::@constrain(%3, %21, %22) : (!struct.type<@BigLessThan_10::@BigLessThan_10<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + %23 = pod.read %6[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %24 = pod.read %6[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @BigSub_14::@BigSub_14::@constrain(%5, %23, %24) : (!struct.type<@BigSub_14::@BigSub_14<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + %25 = pod.read %2[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %26 = pod.read %2[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @BigAdd_4::@BigAdd_4::@constrain(%1, %25, %26) : (!struct.type<@BigAdd_4::@BigAdd_4<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Fp2Add_16 { + struct.def @Fp2Add_16 { + struct.member @out : !array.type<2,2 x !felt.type<"babybear">> {llzk.pub} + struct.member @adders : !array.type<2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> + struct.member @adders$inputs : !array.type<2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> + function.def @product(%arg0: !array.type<2,2 x !felt.type<"babybear">>, %arg1: !array.type<2,2 x !felt.type<"babybear">>) -> !struct.type<@Fp2Add_16::@Fp2Add_16<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Fp2Add_16::@Fp2Add_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %3[@count] = %c4 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %3 : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%5, %6] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_0[%8] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %9[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %10[%11] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array_0[%12] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %13[@a] = %10 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%14] = %13 : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %array[%15] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %17 = pod.read %16[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %16[@count] = %18 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %35 = pod.read %13[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %13[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @FpAdd_15::@FpAdd_15::@compute(%35, %36) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %16[@comp] = %37 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %38 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%38] = %16 : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %20 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %21 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %22 = array.read %arg1[%20, %21] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %array_0[%23] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %24[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %25[%26] = %22 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %27 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array_0[%27] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %28[@b] = %25 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %29 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%29] = %28 : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %array[%30] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %32 = pod.read %31[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %33 = arith.subi %32, %c1 {product_source = "compute"} : index + pod.write %31[@count] = %33 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.cmpi eq, %33, %c0 {product_source = "compute"} : index + scf.if %34 { + %35 = pod.read %28[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %36 = pod.read %28[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @FpAdd_15::@FpAdd_15::@compute(%35, %36) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %31[@comp] = %37 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %38 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%38] = %31 : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array[%5] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %8[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%11, %12] = %10 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders$inputs] = %array_0 : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %4 : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders] = %array_2 : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@adders] : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@adders$inputs] : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %array_3 = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg0[%5, %6] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %2[%8] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = pod.read %9[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%13, %14] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %1[%5] : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %7 = struct.readm %6[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %7[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg2] : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg2] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @FpAdd_15::@FpAdd_15::@constrain(%3, %5, %6) : (!struct.type<@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@Fp2Add_16::@Fp2Add_16<[]>> + } + function.def @compute(%arg0: !array.type<2,2 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<2,2 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@Fp2Add_16::@Fp2Add_16<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "compute"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "compute"} + %c4 = arith.constant {product_source = "compute"} 4 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@Fp2Add_16::@Fp2Add_16<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg2] = %0 : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_1 = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_0[%5] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %6[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%8] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %array_0[%9] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %10[@a] = %7 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%11] = %10 : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %array[%12] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %14 = pod.read %13[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %13[@count] = %15 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %32 = pod.read %10[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %10[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @FpAdd_15::@FpAdd_15::@compute(%32, %33) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %13[@comp] = %34 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %35 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%35] = %13 : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %17 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %18 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg1[%17, %18] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %array_0[%20] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %21[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %19 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %25 = array.read %array_0[%24] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + pod.write %25[@b] = %22 : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %26 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%26] = %25 : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %28 = array.read %array[%27] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@count] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %28[@count] = %30 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %32 = pod.read %25[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %25[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %34 = function.call @FpAdd_15::@FpAdd_15::@compute(%32, %33) : (!array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + pod.write %28[@comp] = %34 : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %35 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%35] = %28 : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %array[%2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %4 = pod.read %3[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8, %9] = %7 : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders$inputs] = %array_0 : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "compute"} + %array_2 = array.new : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %0 = array.read %array[%arg2] : <2 x !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@FpAdd_15::@FpAdd_15<[]>>, @params: !pod.type<[]>]>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + array.write %array_2[%arg2] = %1 : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@adders] = %array_2 : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Fp2Add_16::@Fp2Add_16<[]>> + } + function.def @constrain(%arg0: !struct.type<@Fp2Add_16::@Fp2Add_16<[]>>, %arg1: !array.type<2,2 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<2,2 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c2 = arith.constant {product_source = "constrain"} 2 : index + %felt_const_3 = felt.const 3 : <"babybear"> {product_source = "constrain"} + %felt_const_2 = felt.const 2 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2,2 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@adders] : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@adders$inputs] : <@Fp2Add_16::@Fp2Add_16<[]>>, !array.type<2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>> {product_source = "constrain"} + %array = array.new %felt_const_3, %felt_const_2 : <2 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%5, %6] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %2[%8] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %10 = pod.read %9[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg2[%13, %14] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %18 = pod.read %17[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg4 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg4 : index, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %1[%5] : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %7 = struct.readm %6[@out] : <@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %7[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%10, %11] : <2,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c2 step %c1 { + %3 = array.read %1[%arg3] : <2 x !struct.type<@FpAdd_15::@FpAdd_15<[]>>>, !struct.type<@FpAdd_15::@FpAdd_15<[]>> {product_source = "constrain"} + %4 = array.read %2[%arg3] : <2 x !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>>, !pod.type<[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = pod.read %4[@a] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = pod.read %4[@b] : <[@a: !array.type<2 x !felt.type<"babybear">>, @b: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @FpAdd_15::@FpAdd_15::@constrain(%3, %5, %6) : (!struct.type<@FpAdd_15::@FpAdd_15<[]>>, !array.type<2 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/test_secp256k1_poc.llzk b/examples/circom-demo/test_secp256k1_poc.llzk new file mode 100644 index 0000000..1b8f0eb --- /dev/null +++ b/examples/circom-demo/test_secp256k1_poc.llzk @@ -0,0 +1,8673 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>} { + function.def @getProperRepresentation_0(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 = felt.const 21888242871839275222246405745257275088548364400416034343698204186575808495616 : <"babybear"> + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = felt.umod %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = bool.cmp eq(%0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = scf.if %1 -> (!felt.type<"babybear">) { + %6 = felt.uintdiv %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6 : !felt.type<"babybear"> + } else { + %6 = felt.uintdiv %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + %nondet = llzk.nondet : !array.type<100,100 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c2] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c3] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c4] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c5] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c6] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c7] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c8] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c9] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c10] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c11] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c12] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c13] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c14] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c15] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c16] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c17] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c18] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c19] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c20] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c21] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c22] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c23] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c24] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c25] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c26] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c27] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c28] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c29] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c30] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c31] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c32] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c33] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c34] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c35] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c36] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c37] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c38] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c39] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c40] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c41] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c42] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c43] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c44] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c45] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c46] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c47] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c48] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c49] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c50] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c51] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c52] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c53] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c54] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c55] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c56] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c57] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c58] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c59] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c60] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c61] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c62] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c63] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c64] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c65] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c66] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c67] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c68] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c69] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c70] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c71] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c72] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c73] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c74] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c75] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c76] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c77] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c78] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c79] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c80] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c81] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c82] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c83] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c84] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c85] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c86] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c87] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c88] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c89] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c90] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c91] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c92] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c93] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c94] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c95] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c96] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c97] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c98] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c99] = %nondet_0 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + %3 = cast.toindex %arg2 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %3 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + scf.for %arg5 = %c0 to %c100 step %c1 { + %11 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %12 = cast.toindex %6 : !felt.type<"babybear"> + %13 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet[%12, %13] = %felt_const_0 : <100,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %7 = cast.toindex %6 : !felt.type<"babybear"> + %8 = array.read %arg3[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = function.call @isNegative_2(%8) : (!felt.type<"babybear">) -> !felt.type<"babybear"> + %10 = bool.cmp eq(%9, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %10 { + %nondet_3 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %6 : !felt.type<"babybear"> + %12 = array.read %arg3[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.mul %12, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = function.call @splitOverflowedRegister_3(%arg0, %arg1, %13) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<100 x !felt.type<"babybear">> + %15 = cast.toindex %2 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %15 step %c1 { + %16 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %17 = cast.toindex %16 : !felt.type<"babybear"> + %18 = array.read %14[%17] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %18, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %6 : !felt.type<"babybear"> + %21 = cast.toindex %16 : !felt.type<"babybear"> + array.write %nondet[%20, %21] = %19 : <100,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %11 = cast.toindex %6 : !felt.type<"babybear"> + %12 = array.read %arg3[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = function.call @splitOverflowedRegister_3(%arg0, %arg1, %12) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) -> !array.type<100 x !felt.type<"babybear">> + %14 = cast.toindex %6 : !felt.type<"babybear"> + array.insert %nondet[%14] = %13 : <100,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + } + } + %nondet_1 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = cast.toindex %6 : !felt.type<"babybear"> + array.write %nondet_1[%7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %6 : !felt.type<"babybear"> + array.write %nondet_2[%8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %4 = felt.add %arg2, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %5 step %c1 { + %6 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %7 = bool.cmp gt(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = scf.if %7 -> (!felt.type<"babybear">) { + %14 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %nondet_2[%15] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %16 : !felt.type<"babybear"> + } else { + scf.yield %felt_const_0 : !felt.type<"babybear"> + } + %9 = bool.cmp ge(%6, %2) : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = scf.if %9 -> (!felt.type<"babybear">) { + %14 = felt.sub %6, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.add %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %15 : !felt.type<"babybear"> + } else { + scf.yield %felt_const_0 : !felt.type<"babybear"> + } + %11:2 = scf.while (%arg5 = %8, %arg6 = %10) : (!felt.type<"babybear">, !felt.type<"babybear">) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %14 = bool.cmp le(%arg6, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%14) %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">, %arg6: !felt.type<"babybear">): + %14 = bool.cmp lt(%arg6, %arg2) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = scf.if %14 -> (!felt.type<"babybear">) { + %17 = cast.toindex %arg6 : !felt.type<"babybear"> + %18 = felt.sub %6, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %nondet[%17, %19] : <100,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %21 : !felt.type<"babybear"> + } else { + scf.yield %arg5 : !felt.type<"babybear"> + } + %16 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %12 = function.call @isNegative_2(%11#0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> + %13 = bool.cmp eq(%12, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %13 { + %14 = felt.mul %11#0, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.umod %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %6 : !felt.type<"babybear"> + array.write %nondet_1[%19] = %18 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.shr %14, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.mul %20, %felt_const_21888242871839275222246405745257275088548364400416034343698204186575808495616 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %6 : !felt.type<"babybear"> + array.write %nondet_2[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %14 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.umod %11#0, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %6 : !felt.type<"babybear"> + array.write %nondet_1[%16] = %15 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.shr %11#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %6 : !felt.type<"babybear"> + array.write %nondet_2[%18] = %17 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + function.return %nondet_1 : !array.type<100 x !felt.type<"babybear">> + } + function.def @long_div_1(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<8 x !felt.type<"babybear">>, %arg4: !array.type<4 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c100 = arith.constant 100 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.insert %nondet[%c0] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + array.insert %nondet[%c1] = %nondet_0 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = felt.add %arg2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %1 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg3[%6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + array.write %nondet_1[%8] = %7 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_2 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = scf.while (%arg5 = %arg2) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %5 = bool.cmp ge(%arg5, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%5) %arg5 : !felt.type<"babybear"> + } do { + ^bb0(%arg5: !felt.type<"babybear">): + %5 = bool.cmp eq(%arg5, %arg5) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %5 { + %17 = cast.toindex %arg1 : !felt.type<"babybear"> + array.write %nondet_3[%17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = scf.while (%arg6 = %18) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %20 = bool.cmp ge(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%20) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %20 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %20 : !felt.type<"babybear"> + %22 = array.read %nondet_1[%21] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet_3[%23] = %22 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %24 : !felt.type<"babybear"> + } + } else { + %17 = scf.while (%arg6 = %arg1) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %18 = bool.cmp ge(%arg6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%18) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %18 = felt.add %arg6, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = cast.toindex %18 : !felt.type<"babybear"> + %20 = array.read %nondet_1[%19] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = cast.toindex %arg6 : !felt.type<"babybear"> + array.write %nondet_3[%21] = %20 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } + } + %6 = function.call @short_div_4(%arg0, %arg1, %nondet_3, %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %7 = cast.toindex %arg5 : !felt.type<"babybear"> + array.write %nondet[%c0, %7] = %6 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_4 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_4[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_4[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %arg5 : !felt.type<"babybear"> + %9 = array.read %nondet[%c0, %8] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = function.call @long_scalar_mult_5(%arg0, %arg1, %9, %arg4) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_5[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_5[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + scf.for %arg6 = %c0 to %12 step %c1 { + %17 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet_5[%18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %13 = scf.while (%arg6 = %felt_const_0) : (!felt.type<"babybear">) -> !felt.type<"babybear"> { + %17 = bool.cmp le(%arg6, %arg1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%17) %arg6 : !felt.type<"babybear"> + } do { + ^bb0(%arg6: !felt.type<"babybear">): + %17 = felt.add %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = bool.cmp lt(%17, %18) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %19 { + %21 = cast.toindex %arg6 : !felt.type<"babybear"> + %22 = array.read %10[%21] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = cast.toindex %23 : !felt.type<"babybear"> + array.write %nondet_5[%24] = %22 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %20 = felt.add %arg6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %20 : !felt.type<"babybear"> + } + %14 = felt.add %arg5, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = function.call @long_sub_6(%arg0, %14, %nondet_1, %nondet_5) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg6 = %c0 to %c100 step %c1 { + %17 = array.read %15[%arg6] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%arg6] = %17 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %16 = felt.sub %arg5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %16 : !felt.type<"babybear"> + } + %3 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg5 = %c0 to %3 step %c1 { + %5 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + array.write %nondet[%c1, %8] = %7 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %4 = cast.toindex %arg1 : !felt.type<"babybear"> + array.write %nondet[%c1, %4] = %felt_const_0 : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> + function.return %nondet : !array.type<2,100 x !felt.type<"babybear">> + } + function.def @isNegative_2(%arg0: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808 = felt.const 10944121435919637611123202872628637544274182200208017171849102093287904247808 : <"babybear"> + %0 = bool.cmp gt(%arg0, %felt_const_10944121435919637611123202872628637544274182200208017171849102093287904247808) : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = arith.select %0, %felt_const_1, %felt_const_0 : !felt.type<"babybear"> + function.return %1 : !felt.type<"babybear"> + } + function.def @splitOverflowedRegister_3(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c100 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = function.call @div_ceil_7(%arg0, %arg1) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = scf.for %arg3 = %c0 to %1 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = felt.shl %felt_const_1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.umod %arg4, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.shr %arg4, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7 : !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @short_div_4(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<4 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c199 = arith.constant 199 : index + %c198 = arith.constant 198 : index + %c197 = arith.constant 197 : index + %c196 = arith.constant 196 : index + %c195 = arith.constant 195 : index + %c194 = arith.constant 194 : index + %c193 = arith.constant 193 : index + %c192 = arith.constant 192 : index + %c191 = arith.constant 191 : index + %c190 = arith.constant 190 : index + %c189 = arith.constant 189 : index + %c188 = arith.constant 188 : index + %c187 = arith.constant 187 : index + %c186 = arith.constant 186 : index + %c185 = arith.constant 185 : index + %c184 = arith.constant 184 : index + %c183 = arith.constant 183 : index + %c182 = arith.constant 182 : index + %c181 = arith.constant 181 : index + %c180 = arith.constant 180 : index + %c179 = arith.constant 179 : index + %c178 = arith.constant 178 : index + %c177 = arith.constant 177 : index + %c176 = arith.constant 176 : index + %c175 = arith.constant 175 : index + %c174 = arith.constant 174 : index + %c173 = arith.constant 173 : index + %c172 = arith.constant 172 : index + %c171 = arith.constant 171 : index + %c170 = arith.constant 170 : index + %c169 = arith.constant 169 : index + %c168 = arith.constant 168 : index + %c167 = arith.constant 167 : index + %c166 = arith.constant 166 : index + %c165 = arith.constant 165 : index + %c164 = arith.constant 164 : index + %c163 = arith.constant 163 : index + %c162 = arith.constant 162 : index + %c161 = arith.constant 161 : index + %c160 = arith.constant 160 : index + %c159 = arith.constant 159 : index + %c158 = arith.constant 158 : index + %c157 = arith.constant 157 : index + %c156 = arith.constant 156 : index + %c155 = arith.constant 155 : index + %c154 = arith.constant 154 : index + %c153 = arith.constant 153 : index + %c152 = arith.constant 152 : index + %c151 = arith.constant 151 : index + %c150 = arith.constant 150 : index + %c149 = arith.constant 149 : index + %c148 = arith.constant 148 : index + %c147 = arith.constant 147 : index + %c146 = arith.constant 146 : index + %c145 = arith.constant 145 : index + %c144 = arith.constant 144 : index + %c143 = arith.constant 143 : index + %c142 = arith.constant 142 : index + %c141 = arith.constant 141 : index + %c140 = arith.constant 140 : index + %c139 = arith.constant 139 : index + %c138 = arith.constant 138 : index + %c137 = arith.constant 137 : index + %c136 = arith.constant 136 : index + %c135 = arith.constant 135 : index + %c134 = arith.constant 134 : index + %c133 = arith.constant 133 : index + %c132 = arith.constant 132 : index + %c131 = arith.constant 131 : index + %c130 = arith.constant 130 : index + %c129 = arith.constant 129 : index + %c128 = arith.constant 128 : index + %c127 = arith.constant 127 : index + %c126 = arith.constant 126 : index + %c125 = arith.constant 125 : index + %c124 = arith.constant 124 : index + %c123 = arith.constant 123 : index + %c122 = arith.constant 122 : index + %c121 = arith.constant 121 : index + %c120 = arith.constant 120 : index + %c119 = arith.constant 119 : index + %c118 = arith.constant 118 : index + %c117 = arith.constant 117 : index + %c116 = arith.constant 116 : index + %c115 = arith.constant 115 : index + %c114 = arith.constant 114 : index + %c113 = arith.constant 113 : index + %c112 = arith.constant 112 : index + %c111 = arith.constant 111 : index + %c110 = arith.constant 110 : index + %c109 = arith.constant 109 : index + %c108 = arith.constant 108 : index + %c107 = arith.constant 107 : index + %c106 = arith.constant 106 : index + %c105 = arith.constant 105 : index + %c104 = arith.constant 104 : index + %c103 = arith.constant 103 : index + %c102 = arith.constant 102 : index + %c101 = arith.constant 101 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c100 = arith.constant 100 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg3[%2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.uintdiv %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %nondet = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = function.call @long_scalar_mult_8(%arg0, %6, %5, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c100 step %c1 { + %13 = array.read %7[%arg4] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%arg4] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_0 = llzk.nondet : !array.type<200 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c100] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c101] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c102] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c103] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c104] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c105] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c106] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c107] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c108] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c109] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c110] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c111] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c112] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c113] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c114] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c115] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c116] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c117] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c118] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c119] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c120] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c121] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c122] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c123] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c124] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c125] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c126] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c127] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c128] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c129] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c130] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c131] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c132] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c133] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c134] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c135] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c136] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c137] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c138] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c139] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c140] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c141] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c142] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c143] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c144] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c145] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c146] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c147] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c148] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c149] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c150] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c151] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c152] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c153] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c154] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c155] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c156] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c157] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c158] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c159] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c160] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c161] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c162] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c163] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c164] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c165] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c166] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c167] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c168] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c169] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c170] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c171] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c172] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c173] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c174] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c175] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c176] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c177] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c178] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c179] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c180] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c181] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c182] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c183] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c184] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c185] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c186] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c187] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c188] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c189] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c190] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c191] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c192] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c193] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c194] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c195] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c196] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c197] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c198] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c199] = %felt_const_0 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = function.call @long_scalar_mult_5(%arg0, %arg1, %5, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c100 step %c1 { + %13 = array.read %8[%arg4] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%arg4] = %13 : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %9 = cast.toindex %arg1 : !felt.type<"babybear"> + %10 = array.read %nondet_0[%9] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = bool.cmp ne(%10, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = scf.if %11 -> (!felt.type<"babybear">) { + %13 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = function.call @short_div_norm_9(%arg0, %13, %nondet, %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + scf.yield %14 : !felt.type<"babybear"> + } else { + %13 = function.call @short_div_norm_9(%arg0, %arg1, %nondet, %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + scf.yield %13 : !felt.type<"babybear"> + } + function.return %12 : !felt.type<"babybear"> + } + function.def @long_scalar_mult_5(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg3[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.umod %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.uintdiv %7, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet[%18] = %16 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @long_sub_6(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp ge(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%16] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = bool.cmp ge(%4, %10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %11 { + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %arg3[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %nondet_0[%18] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%21] = %20 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%24] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @div_ceil_7(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = felt.umod %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = bool.cmp eq(%0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = scf.if %1 -> (!felt.type<"babybear">) { + %3 = felt.uintdiv %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %3 : !felt.type<"babybear"> + } else { + %3 = felt.uintdiv %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.add %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %4 : !felt.type<"babybear"> + } + function.return %2 : !felt.type<"babybear"> + } + function.def @long_scalar_mult_8(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c100 = arith.constant 100 : index + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c100 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet[%2] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %arg3[%4] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.mul %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.umod %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%10] = %9 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %nondet[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.uintdiv %7, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.add %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.add %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + array.write %nondet[%18] = %16 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + function.def @short_div_norm_9(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<200 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + %1 = array.read %arg2[%0] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg2[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.add %3, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg3[%9] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.uintdiv %7, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.sub %12, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = bool.cmp gt(%11, %13) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = scf.if %14 -> (!felt.type<"babybear">) { + %21 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = felt.sub %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %22 : !felt.type<"babybear"> + } else { + scf.yield %11 : !felt.type<"babybear"> + } + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = function.call @long_scalar_mult_8(%arg0, %arg1, %15, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %17 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = function.call @long_gt_10(%arg0, %17, %16, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %19 = bool.cmp eq(%18, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = scf.if %19 -> (!felt.type<"babybear">) { + %21 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = function.call @long_sub_11(%arg0, %21, %16, %arg3) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> + %23 = felt.add %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = function.call @long_gt_10(%arg0, %23, %22, %arg2) : (!felt.type<"babybear">, !felt.type<"babybear">, !array.type<100 x !felt.type<"babybear">>, !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> + %25 = bool.cmp eq(%24, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = scf.if %25 -> (!felt.type<"babybear">) { + %27 = felt.sub %15, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %27 : !felt.type<"babybear"> + } else { + %27 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %27 : !felt.type<"babybear"> + } + scf.yield %26 : !felt.type<"babybear"> + } else { + scf.yield %15 : !felt.type<"babybear"> + } + function.return %20 : !felt.type<"babybear"> + } + function.def @long_gt_10(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<100 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !felt.type<"babybear"> attributes {function.allow_non_native_field_ops} { + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %nondet = llzk.nondet : !felt.type<"babybear"> + %nondet_0 = llzk.nondet : i1 + %0 = felt.sub %arg1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1:3 = scf.while (%arg4 = %0, %arg5 = %nondet, %arg6 = %nondet_0) : (!felt.type<"babybear">, !felt.type<"babybear">, i1) -> (!felt.type<"babybear">, !felt.type<"babybear">, i1) { + %3 = bool.cmp ge(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = bool.not %arg6 : i1 + %5 = bool.and %4, %3 : i1, i1 + scf.condition(%5) %arg4, %arg5, %arg6 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } do { + ^bb0(%arg4: !felt.type<"babybear">, %arg5: !felt.type<"babybear">, %arg6: i1): + %3 = cast.toindex %arg4 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %arg4 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp gt(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = arith.select %7, %felt_const_1, %arg5 : !felt.type<"babybear"> + %9:3 = scf.if %7 -> (!felt.type<"babybear">, !felt.type<"babybear">, i1) { + %nondet_1 = llzk.nondet : !felt.type<"babybear"> + scf.yield %nondet_1, %8, %true : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } else { + %10 = cast.toindex %arg4 : !felt.type<"babybear"> + %11 = array.read %arg2[%10] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %arg4 : !felt.type<"babybear"> + %13 = array.read %arg3[%12] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = bool.cmp lt(%11, %13) : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = arith.select %14, %felt_const_0, %8 : !felt.type<"babybear"> + %16 = scf.if %14 -> (!felt.type<"babybear">) { + %nondet_1 = llzk.nondet : !felt.type<"babybear"> + scf.yield %nondet_1 : !felt.type<"babybear"> + } else { + %17 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %17 : !felt.type<"babybear"> + } + scf.yield %16, %15, %14 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } + scf.yield %9#0, %9#1, %9#2 : !felt.type<"babybear">, !felt.type<"babybear">, i1 + } + %2 = arith.select %1#2, %1#1, %felt_const_0 : !felt.type<"babybear"> + function.return %2 : !felt.type<"babybear"> + } + function.def @long_sub_11(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">, %arg2: !array.type<100 x !felt.type<"babybear">>, %arg3: !array.type<200 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> attributes {function.allow_non_native_field_ops} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_0 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %0 = cast.toindex %arg1 : !felt.type<"babybear"> + scf.for %arg4 = %c0 to %0 step %c1 { + %1 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %2 = bool.cmp eq(%1, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = bool.cmp ge(%4, %6) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %7 { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%13] = %12 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %8 = cast.toindex %1 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = cast.toindex %1 : !felt.type<"babybear"> + %11 = array.read %arg3[%10] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.sub %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = felt.add %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%15] = %14 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%16] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } else { + %3 = cast.toindex %1 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %nondet_0[%8] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.add %6, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = bool.cmp ge(%4, %10) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %11 { + %12 = cast.toindex %1 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = cast.toindex %1 : !felt.type<"babybear"> + %15 = array.read %arg3[%14] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = felt.sub %13, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = cast.toindex %17 : !felt.type<"babybear"> + %19 = array.read %nondet_0[%18] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%21] = %20 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %12 = felt.shl %felt_const_1, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %1 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <200 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %19 : !felt.type<"babybear"> + %21 = array.read %nondet_0[%20] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.sub %18, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%23] = %22 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%24] = %felt_const_1 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + } + function.return %nondet : !array.type<100 x !felt.type<"babybear">> + } + poly.template @BigMultNoCarry_0 { + struct.def @BigMultNoCarry_0 { + struct.member @out : !array.type<7 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c7 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c4 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c7 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c7 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c7 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c7 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c7 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c7 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c7 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @BigMultNoCarry_1 { + struct.def @BigMultNoCarry_1 { + struct.member @out : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<7 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c7 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c10 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c10 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c7 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<10 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, %arg1: !array.type<7 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c10 = arith.constant 10 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<10 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c10 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c7 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c6] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c7] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c8] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c9] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c10 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c10 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c7 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c10 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @A3NoCarry_2 { + struct.def @A3NoCarry_2 { + struct.member @a3 : !array.type<10 x !felt.type<"babybear">> {llzk.pub} + struct.member @a2 : !array.type<7 x !felt.type<"babybear">> + struct.member @a2Comp : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.member @a2Comp$inputs : !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + struct.member @a3Comp : !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> + struct.member @a3Comp$inputs : !pod.type<[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c10 = arith.constant 10 : index + %c7 = arith.constant 7 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%13] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %15 : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %27 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_1[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%27, %28) : (!array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %29 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %20 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%20] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_1[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %22 : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %25 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %28 = pod.read %pod_1[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%27, %28) : (!array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %29 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c7 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%17] = %16 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c7 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %nondet[%13] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %15 : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %18 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_3[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%20, %21) : (!array.type<7 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %22 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%13] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_3[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %15[%16] = %14 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@b] = %15 : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %18 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %20 = pod.read %pod_3[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_3[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %22 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%20, %21) : (!array.type<7 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %22 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + %14 = struct.readm %13[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %14[%15] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%17] = %16 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@a3Comp$inputs] = %pod_3 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + struct.writem %self[@a3Comp] = %0 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + struct.writem %self[@a2Comp$inputs] = %pod_1 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@a2Comp] = %1 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@a2] = %nondet : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@a3] = %nondet_0 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %2 = struct.readm %self[@a3] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %self[@a2] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@a2Comp] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@a2Comp$inputs] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %self[@a3Comp] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "constrain"} + %7 = struct.readm %self[@a3Comp$inputs] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%13] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %5[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %arg0[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %5[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c7 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %4[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %3[%16] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c7 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %3[%13] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %7[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg0[%13] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %7[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %12 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %6[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %2[%16] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = pod.read %7[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %7[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@constrain(%6, %8, %9) : (!struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<7 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %5[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = pod.read %5[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%4, %10, %11) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c10 = arith.constant 10 : index + %c7 = arith.constant 7 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %5 : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %17 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_1[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%17, %18) : (!array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%10] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_1[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@b] = %12 : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %18 = pod.read %pod_1[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%17, %18) : (!array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c7 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7] = %6 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c7 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %nondet[%3] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_3[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %5 : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %10 = pod.read %pod_3[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_3[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%10, %11) : (!array.type<7 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %12 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_3[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@b] = %5 : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %8 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %10 = pod.read %pod_3[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_3[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@compute(%10, %11) : (!array.type<7 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %12 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %4[%5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%7] = %6 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@a3Comp$inputs] = %pod_3 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + struct.writem %self[@a3Comp] = %0 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "compute"} + struct.writem %self[@a2Comp$inputs] = %pod_1 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@a2Comp] = %1 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "compute"} + struct.writem %self[@a2] = %nondet : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@a3] = %nondet_0 : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c10 = arith.constant 10 : index + %c7 = arith.constant 7 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@a3] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@a2] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@a2Comp] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@a2Comp$inputs] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@a3Comp] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@a3Comp$inputs] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !pod.type<[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg1[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg1[%16] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %3[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %18[%19] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c7 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %2[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %1[%14] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c7 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %1[%11] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %5[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg1[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %5[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %13[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %4[@out] : <@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %11[%12] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = pod.read %5[@a] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = pod.read %5[@b] : <[@a: !array.type<7 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_1::@BigMultNoCarry_1::@constrain(%4, %6, %7) : (!struct.type<@BigMultNoCarry_1::@BigMultNoCarry_1<[]>>, !array.type<7 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = pod.read %3[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%2, %8, %9) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @A2NoCarry_3 { + struct.def @A2NoCarry_3 { + struct.member @a2 : !array.type<7 x !felt.type<"babybear">> {llzk.pub} + struct.member @a2Comp : !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.member @a2Comp$inputs : !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c7 = arith.constant 7 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %self = struct.new : <@A2NoCarry_3::@A2NoCarry_3<[]>> + %nondet = llzk.nondet : !array.type<7 x !felt.type<"babybear">> + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = pod.read %pod_0[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %5 = cast.toindex %1 : !felt.type<"babybear"> + array.write %4[%5] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %4 : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %6 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index + %7 = arith.subi %6, %c1 : index + pod.write %pod[@count] = %7 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index + %8 = arith.cmpi eq, %7, %c0 : index + scf.if %8 { + %16 = pod.read %pod_0[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %18 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%16, %17) : (!array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + pod.write %pod[@comp] = %18 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + } + %9 = cast.toindex %1 : !felt.type<"babybear"> + %10 = array.read %arg0[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %pod_0[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %12 = cast.toindex %1 : !felt.type<"babybear"> + array.write %11[%12] = %10 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %11 : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.subi %13, %c1 : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, index + %15 = arith.cmpi eq, %14, %c0 : index + scf.if %15 { + %16 = pod.read %pod_0[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %17 = pod.read %pod_0[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %18 = function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@compute(%16, %17) : (!array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + pod.write %pod[@comp] = %18 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + } + } + scf.for %arg1 = %c0 to %c7 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + %3 = struct.readm %2[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %3[%4] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%6] = %5 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@a2Comp$inputs] = %pod_0 : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.writem %self[@a2Comp] = %0 : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + struct.writem %self[@a2] = %nondet : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<7 x !felt.type<"babybear">> + function.return %self : !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c7 = arith.constant 7 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@a2] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<7 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a2Comp] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>> + %2 = struct.readm %arg0[@a2Comp$inputs] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %8[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = cast.toindex %5 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = pod.read %2[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %14 = cast.toindex %5 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c7 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = struct.readm %1[@out] : <@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<7 x !felt.type<"babybear">> + %7 = cast.toindex %5 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = pod.read %2[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + %4 = pod.read %2[@b] : <[@a: !array.type<4 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> + function.call @BigMultNoCarry_0::@BigMultNoCarry_0::@constrain(%1, %3, %4) : (!struct.type<@BigMultNoCarry_0::@BigMultNoCarry_0<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Secp256k1PrimeReduce10Registers_4 { + struct.def @Secp256k1PrimeReduce10Registers_4 { + struct.member @out : !array.type<4 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c9 = arith.constant 9 : index + %c2 = arith.constant 2 : index + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %c7 = arith.constant 7 : index + %felt_const_8392367050913 = felt.const 8392367050913 : <"babybear"> {product_source = "compute"} + %felt_const_4294968273 = felt.const 4294968273 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c7] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %0, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c3] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%c6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%c2] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %9 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %10, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%c5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %12, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %11, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%c1] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %18 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg0[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %19, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%c4] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %21, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %20, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %25 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %26 = struct.readm %self[@out] : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = array.read %arg0[%c7] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %28 = felt.mul %27, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %arg0[%c3] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = felt.add %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %26[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %arg0[%c6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %33 = felt.mul %32, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %arg0[%c2] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %35 = felt.add %33, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %arg0[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %37 = felt.add %35, %36 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %26[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %38, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %39 = array.read %arg0[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = felt.mul %39, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %arg0[%c5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %42 = felt.mul %41, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = felt.add %40, %42 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %44 = array.read %arg0[%c1] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %45 = felt.add %43, %44 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = array.read %arg0[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %47 = felt.add %45, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = array.read %26[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %48, %47 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %49 = array.read %arg0[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = felt.mul %49, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = array.read %arg0[%c4] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %52 = felt.mul %51, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %53 = felt.add %50, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %55 = felt.add %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %56 = array.read %26[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %56, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> + } + function.def @compute(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c9 = arith.constant 9 : index + %c2 = arith.constant 2 : index + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %c7 = arith.constant 7 : index + %felt_const_8392367050913 = felt.const 8392367050913 : <"babybear"> {product_source = "compute"} + %felt_const_4294968273 = felt.const 4294968273 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c7] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.mul %0, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c3] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %3 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%c6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%c2] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %arg0[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %9 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.mul %10, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %arg0[%c5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = felt.mul %12, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.add %11, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %arg0[%c1] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = felt.add %14, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %18 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = array.read %arg0[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.mul %19, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %21 = array.read %arg0[%c4] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %22 = felt.mul %21, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = felt.add %20, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %arg0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %25 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, %arg1: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %c8 = arith.constant 8 : index + %c1 = arith.constant 1 : index + %c5 = arith.constant 5 : index + %c9 = arith.constant 9 : index + %c2 = arith.constant 2 : index + %c6 = arith.constant 6 : index + %c3 = arith.constant 3 : index + %c7 = arith.constant 7 : index + %felt_const_8392367050913 = felt.const 8392367050913 : <"babybear"> {product_source = "constrain"} + %felt_const_4294968273 = felt.const 4294968273 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = array.read %arg1[%c7] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = felt.mul %1, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %arg1[%c3] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %2, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %0[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.mul %6, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg1[%c2] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg1[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.add %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %0[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%c9] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = felt.mul %13, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%c5] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %15, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.add %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg1[%c1] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg1[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %0[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%c8] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = felt.mul %23, %felt_const_8392367050913 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %arg1[%c4] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %25, %felt_const_4294968273 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %arg1[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %27, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %30, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_5 { + struct.def @Num2Bits_5 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %0:2 = scf.for %arg1 = %c0 to %c64 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%4] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %1 : !felt.type<"babybear"> + %6 = array.read %nondet[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %1:2 = scf.for %arg2 = %c0 to %c64 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %2 : !felt.type<"babybear"> + %10 = array.read %0[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @BigMultNoCarry_6 { + struct.def @BigMultNoCarry_6 { + struct.member @out : !array.type<6 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet_0 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c6 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c4 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %nondet_0[%3] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %1 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.mul %6, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.add %4, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + array.write %nondet_0[%12] = %10 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg2 = %c0 to %c6 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %nondet_0[%1] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %2 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + %nondet_1 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_3 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_3[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_3[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c6 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c6 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_3[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %nondet[%7] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_3[%12] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_1[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_1[%12] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + %6 = array.read %nondet_2[%5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %arg1[%7] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.pow %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %6, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_2[%12] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<6 x !felt.type<"babybear">> + function.return %self : !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>, %arg2: !array.type<4 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c3 = arith.constant 3 : index + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<6 x !felt.type<"babybear">> + bool.assert %true, "assertion failed" + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c6 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet[%2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c4 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %nondet[%4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.mul %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.add %5, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + array.write %nondet[%13] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + %nondet_0 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_0[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_1 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_1[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_1[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %nondet_2 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> + array.write %nondet_2[%c0] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c1] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c5] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg3 = %c0 to %c6 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%2] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%3] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%4] = %felt_const_0 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.for %arg4 = %c0 to %c6 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_2[%6] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %0[%8] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_2[%13] = %12 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_0[%6] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_0[%13] = %12 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + scf.for %arg4 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %5 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = felt.pow %1, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %11 = felt.mul %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.add %7, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %1 : !felt.type<"babybear"> + array.write %nondet_1[%13] = %12 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + scf.for %arg3 = %c0 to %c6 step %c1 { + %1 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %nondet_2[%2] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %nondet_0[%4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %nondet_1[%6] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %5, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Num2Bits_7 { + struct.def @Num2Bits_7 { + struct.member @out : !array.type<182 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c182 = arith.constant 182 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<182 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<182 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c182 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<182 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c182 = arith.constant 182 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<182 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c182 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<182 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c182 = arith.constant 182 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<182 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c182 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <182 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CheckCarryToZero_8 { + struct.def @CheckCarryToZero_8 { + struct.member @carry : !array.type<6 x !felt.type<"babybear">> + struct.member @carryRangeChecks : !array.type<6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> + struct.member @carryRangeChecks$inputs : !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> + function.def @product(%arg0: !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_3064991081731777716716694054300618367237478244367204352 = felt.const 3064991081731777716716694054300618367237478244367204352 : <"babybear"> {product_source = "compute"} + %felt_const_18446744073709551616 = felt.const 18446744073709551616 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %6 = array.read %array[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %6[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %6 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %7 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %7 { + %19 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = felt.div %19, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %20 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %19 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %arg0[%19] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %nondet[%22] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = felt.add %20, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %25 = felt.div %24, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %26 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%26] = %25 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet[%8] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %9, %felt_const_3064991081731777716716694054300618367237478244367204352 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array_0[%11] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %12[@in] = %10 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%13] = %12 : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %array[%14] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %16 = pod.read %15[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %15[@count] = %17 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = function.call @Num2Bits_7::@Num2Bits_7::@product(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %21 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + pod.write %15[@comp] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %22 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%22] = %15 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@carryRangeChecks$inputs] = %array_0 : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %6 = array.read %array[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %7 = pod.read %6[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %7 : <6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@carryRangeChecks] = %array_1 : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> {product_source = "compute"} + struct.writem %self[@carry] = %nondet : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@carry] : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %self[@carryRangeChecks] : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> {product_source = "constrain"} + %2 = struct.readm %self[@carryRangeChecks$inputs] : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %7 { + %14 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %15, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg0[%14] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%17] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%20] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %21, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %9, %felt_const_3064991081731777716716694054300618367237478244367204352 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %2[%11] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = array.read %arg0[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %6 = array.read %1[%arg1] : <6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "constrain"} + %7 = array.read %2[%arg1] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%6, %8) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return %self : !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> + } + function.def @compute(%arg0: !array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c5 = arith.constant 5 : index + %true = arith.constant true + %felt_const_3064991081731777716716694054300618367237478244367204352 = felt.const 3064991081731777716716694054300618367237478244367204352 : <"babybear"> {product_source = "compute"} + %felt_const_18446744073709551616 = felt.const 18446744073709551616 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %self = struct.new : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %0 = array.read %array[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %0 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_0 = array.new : <6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + scf.for %arg1 = %c0 to %c5 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %1 = bool.cmp eq(%0, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %1 { + %13 = array.read %arg0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = felt.div %13, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %14 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } else { + %13 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %14 = array.read %arg0[%13] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %15 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet[%16] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %14, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.div %18, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%20] = %19 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %nondet[%2] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.add %3, %felt_const_3064991081731777716716694054300618367237478244367204352 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %array_0[%5] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %6[@in] = %4 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_0[%7] = %6 : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %8 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array[%8] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %10 = pod.read %9[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %9[@count] = %11 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %14 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%13) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + pod.write %9[@comp] = %14 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %15 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%15] = %9 : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@carryRangeChecks$inputs] = %array_0 : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_1 = array.new : <6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %0 = array.read %array[%arg1] : <6 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + array.write %array_1[%arg1] = %1 : <6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@carryRangeChecks] = %array_1 : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> {product_source = "compute"} + struct.writem %self[@carry] = %nondet : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, %arg1: !array.type<6 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c6 = arith.constant {product_source = "constrain"} 6 : index + %felt_const_3064991081731777716716694054300618367237478244367204352 = felt.const 3064991081731777716716694054300618367237478244367204352 : <"babybear"> {product_source = "constrain"} + %felt_const_18446744073709551616 = felt.const 18446744073709551616 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@carry] : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@carryRangeChecks] : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>> {product_source = "constrain"} + %2 = struct.readm %arg0[@carryRangeChecks$inputs] : <@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + scf.for %arg2 = %c0 to %c5 step %c1 { + %6 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %7 = bool.cmp eq(%6, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %7 { + %14 = array.read %arg1[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c0] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.mul %15, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %14 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %arg1[%14] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %0[%17] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %0[%20] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.mul %21, %felt_const_18446744073709551616 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %0[%8] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.add %9, %felt_const_3064991081731777716716694054300618367237478244367204352 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %6 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %2[%11] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %13 = pod.read %12[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = array.read %arg1[%c5] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%c4] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.add %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %6 = array.read %1[%arg2] : <6 x !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "constrain"} + %7 = array.read %2[%arg2] : <6 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%6, %8) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @CheckCubicModPIsZero_9 { + struct.def @CheckCubicModPIsZero_9 { + struct.member @p : !array.type<4 x !felt.type<"babybear">> + struct.member @reduced : !array.type<4 x !felt.type<"babybear">> + struct.member @multipleOfP : !array.type<4 x !felt.type<"babybear">> + struct.member @q : !array.type<3 x !felt.type<"babybear">> + struct.member @qpProd : !array.type<6 x !felt.type<"babybear">> + struct.member @qRangeChecks : !array.type<3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> + struct.member @qRangeChecks$inputs : !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> + struct.member @zeroCheck : !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> + struct.member @zeroCheck$inputs : !pod.type<[@in: !array.type<6 x !felt.type<"babybear">>]> + struct.member @qpProdComp : !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> + struct.member @qpProdComp$inputs : !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> + struct.member @secpReducer : !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> + struct.member @secpReducer$inputs : !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_242 = felt.const 242 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_191561942608236107294793378393788647952342390272950272 = felt.const 191561942608236107294793378393788647952342390272950272 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_18446744073709551615 = felt.const 18446744073709551615 : <"babybear"> {product_source = "compute"} + %felt_const_18446744069414583343 = felt.const 18446744069414583343 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c10 = arith.constant {product_source = "compute"} 10 : index + %c7 = arith.constant {product_source = "compute"} 7 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_1 = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_2 = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %28[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %28 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_6 = pod.new { @count = %c7 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_7 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_8 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_9 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_18446744069414583343 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_18446744073709551615 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_18446744073709551615 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_18446744073709551615 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg0[%29] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_9[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %31[%32] = %30 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_9[@in] = %31 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_8[@count] : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %pod_8[@count] = %34 : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %36 = pod.read %pod_9[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %37 = function.call @Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4::@product(%36) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> + %38 = function.call @Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4::@compute(%36) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + pod.write %pod_8[@comp] = %37 : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet[%29] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = felt.mul %30, %felt_const_191561942608236107294793378393788647952342390272950272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%32] = %31 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %30[%31] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %34 = array.read %nondet_1[%33] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %35 = felt.add %32, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%36] = %35 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = function.call @getProperRepresentation_0(%felt_const_242, %felt_const_64, %felt_const_4, %nondet_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_11 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_11[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %0[%29] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%31] = %30 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %nondet_12 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_13 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_13[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_12[%c0] = %nondet_13 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_12[%c1] = %nondet_13 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + %1 = function.call @long_div_1(%felt_const_64, %felt_const_4, %felt_const_4, %nondet_11, %nondet) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<8 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %1[%c0, %29] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%31] = %30 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet_0[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %array_4[%31] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %32[@in] = %30 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%33] = %32 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %34 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %35 = array.read %array[%34] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %36 = pod.read %35[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.subi %36, %c1 {product_source = "compute"} : index + pod.write %35[@count] = %37 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.cmpi eq, %37, %c0 {product_source = "compute"} : index + scf.if %38 { + %39 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %40 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%39) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + pod.write %35[@comp] = %40 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %41 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%41] = %35 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet_0[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_7[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %31[%32] = %30 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@a] = %31 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_6[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %pod_6[@count] = %34 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %36 = pod.read %pod_7[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_7[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @BigMultNoCarry_6::@BigMultNoCarry_6::@compute(%36, %37) : (!array.type<3 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + pod.write %pod_6[@comp] = %38 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %nondet[%29] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_7[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %31[%32] = %30 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@b] = %31 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod_6[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %pod_6[@count] = %34 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %36 = pod.read %pod_7[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_7[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @BigMultNoCarry_6::@BigMultNoCarry_6::@compute(%36, %37) : (!array.type<3 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + pod.write %pod_6[@comp] = %38 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + %30 = struct.readm %29[@out] : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %30[%31] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%33] = %32 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = bool.cmp lt(%28, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %29 { + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %nondet_3[%30] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %33 = array.read %nondet_2[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %34 = felt.sub %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %35 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %36 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %35[%36] = %34 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %35 : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %38 = arith.subi %37, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %38 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %39 = arith.cmpi eq, %38, %c0 {product_source = "compute"} : index + scf.if %39 { + %40 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %41 = function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@product(%40) : (!array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> + %42 = function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@compute(%40) : (!array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %41 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %31 = array.read %nondet_3[%30] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %32 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %32[%33] = %31 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %32 : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %35 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %37 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@compute(%37) : (!array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %38 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@secpReducer$inputs] = %pod_9 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + struct.writem %self[@secpReducer] = %2 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + struct.writem %self[@qRangeChecks$inputs] = %array_4 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_14 = array.new : <3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %29 = pod.read %28[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + array.write %array_14[%arg1] = %29 : <3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@qRangeChecks] = %array_14 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + struct.writem %self[@zeroCheck$inputs] = %pod_5 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + struct.writem %self[@zeroCheck] = %3 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + struct.writem %self[@qpProdComp$inputs] = %pod_7 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + struct.writem %self[@qpProdComp] = %4 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + struct.writem %self[@p] = %nondet : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@multipleOfP] = %nondet_1 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@reduced] = %nondet_2 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@q] = %nondet_0 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@qpProd] = %nondet_3 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %5 = struct.readm %self[@p] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %6 = struct.readm %self[@reduced] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = struct.readm %self[@multipleOfP] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %8 = struct.readm %self[@q] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = struct.readm %self[@qpProd] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@qRangeChecks] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "constrain"} + %11 = struct.readm %self[@qRangeChecks$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %12 = struct.readm %self[@zeroCheck] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@zeroCheck$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<6 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = struct.readm %self[@qpProdComp] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "constrain"} + %15 = struct.readm %self[@qpProdComp$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %16 = struct.readm %self[@secpReducer] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "constrain"} + %17 = struct.readm %self[@secpReducer$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %18 = array.read %5[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %felt_const_18446744069414583343 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %5[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %felt_const_18446744073709551615 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %5[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %felt_const_18446744073709551615 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %5[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %felt_const_18446744073709551615 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %arg0[%29] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = pod.read %17[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %31[%32] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %5[%29] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = felt.mul %30, %felt_const_191561942608236107294793378393788647952342390272950272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %7[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %16[@out] : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %7[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = felt.add %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %6[%35] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_15 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_15[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_15[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = function.call @getProperRepresentation_0(%felt_const_242, %felt_const_64, %felt_const_4, %6) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_16 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_16[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %22[%29] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_16[%31] = %30 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_17 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_18 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_18[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_18[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_17[%c0] = %nondet_18 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_17[%c1] = %nondet_18 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = function.call @long_div_1(%felt_const_64, %felt_const_4, %felt_const_4, %nondet_16, %5) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<8 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %8[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %11[%31] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %8[%29] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = pod.read %15[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %31[%32] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %30 = array.read %5[%29] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %31 = pod.read %15[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %31[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %30 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %14[@out] : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %29[%30] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %9[%32] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %28 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %29 = bool.cmp lt(%28, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %29 { + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %9[%30] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %6[%32] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = felt.sub %31, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %35 = pod.read %13[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %35[%36] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %34 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %30 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %9[%30] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %32 = pod.read %13[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %33 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "constrain"} + %34 = array.read %32[%33] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %34, %31 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %24 = pod.read %17[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4::@constrain(%16, %24) : (!struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %28 = array.read %10[%arg1] : <3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %29 = array.read %11[%arg1] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %30 = pod.read %29[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%28, %30) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %25 = pod.read %13[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@constrain(%12, %25) : (!struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %26 = pod.read %15[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = pod.read %15[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_6::@BigMultNoCarry_6::@constrain(%14, %26, %27) : (!struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> + } + function.def @compute(%arg0: !array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %felt_const_242 = felt.const 242 : <"babybear"> {product_source = "compute"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %felt_const_191561942608236107294793378393788647952342390272950272 = felt.const 191561942608236107294793378393788647952342390272950272 : <"babybear"> {product_source = "compute"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "compute"} + %felt_const_18446744073709551615 = felt.const 18446744073709551615 : <"babybear"> {product_source = "compute"} + %felt_const_18446744069414583343 = felt.const 18446744069414583343 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c10 = arith.constant {product_source = "compute"} 10 : index + %c7 = arith.constant {product_source = "compute"} 7 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_1 = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_2 = llzk.nondet : !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_3 = llzk.nondet : !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %array = array.new : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + pod.write %5[@count] = %c1 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + array.write %array[%arg1] = %5 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + %array_4 = array.new : <3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_6 = pod.new { @count = %c7 } : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_7 = pod.new : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_8 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_9 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + array.write %nondet[%c0] = %felt_const_18446744069414583343 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c1] = %felt_const_18446744073709551615 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c2] = %felt_const_18446744073709551615 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c3] = %felt_const_18446744073709551615 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c10 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %arg0[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_9[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_9[@in] = %8 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_8[@count] : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_8[@count] = %11 : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %pod_9[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4::@compute(%13) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + pod.write %pod_8[@comp] = %14 : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_191561942608236107294793378393788647952342390272950272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_1[%9] = %8 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %7[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %nondet_1[%10] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_2[%13] = %12 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %nondet_10 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_10[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_10[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %0 = function.call @getProperRepresentation_0(%felt_const_242, %felt_const_64, %felt_const_4, %nondet_2) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_11 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_11[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %0[%6] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_11[%8] = %7 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %nondet_12 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_13 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "compute"} + array.write %nondet_13[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_13[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.insert %nondet_12[%c0] = %nondet_13 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + array.insert %nondet_12[%c1] = %nondet_13 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "compute"} + %1 = function.call @long_div_1(%felt_const_64, %felt_const_4, %felt_const_4, %nondet_11, %nondet) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<8 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %1[%c0, %6] : <2,100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%8] = %7 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_0[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %array_4[%8] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %9[@in] = %7 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array_4[%10] = %9 : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %array[%11] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %13 = pod.read %12[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %12[@count] = %14 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %16 = pod.read %9[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %17 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%16) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + pod.write %12[@comp] = %17 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %18 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %array[%18] = %12 : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet_0[%6] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_7[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@a] = %8 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_6[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_6[@count] = %11 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %pod_7[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_7[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @BigMultNoCarry_6::@BigMultNoCarry_6::@compute(%13, %14) : (!array.type<3 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + pod.write %pod_6[@comp] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c4 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_7[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_7[@b] = %8 : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_6[@count] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_6[@count] = %11 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %pod_7[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_7[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @BigMultNoCarry_6::@BigMultNoCarry_6::@compute(%13, %14) : (!array.type<3 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + pod.write %pod_6[@comp] = %15 : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + %7 = struct.readm %6[@out] : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %7[%8] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_3[%10] = %9 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c6 step %c1 { + %5 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %6 = bool.cmp lt(%5, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %6 { + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_3[%7] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %nondet_2[%9] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = felt.sub %8, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %12 : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %18 = function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@compute(%17) : (!array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %18 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + %8 = array.read %nondet_3[%7] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "compute"} + array.write %9[%10] = %8 : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %9 : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %12 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %14 = pod.read %pod_5[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@compute(%14) : (!array.type<6 x !felt.type<"babybear">>) -> !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } {product_source = "compute"} + struct.writem %self[@secpReducer$inputs] = %pod_9 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_8[@comp] : <[@count: index, @comp: !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + struct.writem %self[@secpReducer] = %2 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "compute"} + struct.writem %self[@qRangeChecks$inputs] = %array_4 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "compute"} + %array_14 = array.new : <3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %5 = array.read %array[%arg1] : <3 x !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %6 = pod.read %5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + array.write %array_14[%arg1] = %6 : <3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@qRangeChecks] = %array_14 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "compute"} + struct.writem %self[@zeroCheck$inputs] = %pod_5 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<6 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + struct.writem %self[@zeroCheck] = %3 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "compute"} + struct.writem %self[@qpProdComp$inputs] = %pod_7 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_6[@comp] : <[@count: index, @comp: !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + struct.writem %self[@qpProdComp] = %4 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "compute"} + struct.writem %self[@p] = %nondet : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@multipleOfP] = %nondet_1 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@reduced] = %nondet_2 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@q] = %nondet_0 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@qpProd] = %nondet_3 : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, %arg1: !array.type<10 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c99 = arith.constant 99 : index + %c98 = arith.constant 98 : index + %c97 = arith.constant 97 : index + %c96 = arith.constant 96 : index + %c95 = arith.constant 95 : index + %c94 = arith.constant 94 : index + %c93 = arith.constant 93 : index + %c92 = arith.constant 92 : index + %c91 = arith.constant 91 : index + %c90 = arith.constant 90 : index + %c89 = arith.constant 89 : index + %c88 = arith.constant 88 : index + %c87 = arith.constant 87 : index + %c86 = arith.constant 86 : index + %c85 = arith.constant 85 : index + %c84 = arith.constant 84 : index + %c83 = arith.constant 83 : index + %c82 = arith.constant 82 : index + %c81 = arith.constant 81 : index + %c80 = arith.constant 80 : index + %c79 = arith.constant 79 : index + %c78 = arith.constant 78 : index + %c77 = arith.constant 77 : index + %c76 = arith.constant 76 : index + %c75 = arith.constant 75 : index + %c74 = arith.constant 74 : index + %c73 = arith.constant 73 : index + %c72 = arith.constant 72 : index + %c71 = arith.constant 71 : index + %c70 = arith.constant 70 : index + %c69 = arith.constant 69 : index + %c68 = arith.constant 68 : index + %c67 = arith.constant 67 : index + %c66 = arith.constant 66 : index + %c65 = arith.constant 65 : index + %c64 = arith.constant 64 : index + %c63 = arith.constant 63 : index + %c62 = arith.constant 62 : index + %c61 = arith.constant 61 : index + %c60 = arith.constant 60 : index + %c59 = arith.constant 59 : index + %c58 = arith.constant 58 : index + %c57 = arith.constant 57 : index + %c56 = arith.constant 56 : index + %c55 = arith.constant 55 : index + %c54 = arith.constant 54 : index + %c53 = arith.constant 53 : index + %c52 = arith.constant 52 : index + %c51 = arith.constant 51 : index + %c50 = arith.constant 50 : index + %c49 = arith.constant 49 : index + %c48 = arith.constant 48 : index + %c47 = arith.constant 47 : index + %c46 = arith.constant 46 : index + %c45 = arith.constant 45 : index + %c44 = arith.constant 44 : index + %c43 = arith.constant 43 : index + %c42 = arith.constant 42 : index + %c41 = arith.constant 41 : index + %c40 = arith.constant 40 : index + %c39 = arith.constant 39 : index + %c38 = arith.constant 38 : index + %c37 = arith.constant 37 : index + %c36 = arith.constant 36 : index + %c35 = arith.constant 35 : index + %c34 = arith.constant 34 : index + %c33 = arith.constant 33 : index + %c32 = arith.constant 32 : index + %c31 = arith.constant 31 : index + %c30 = arith.constant 30 : index + %c29 = arith.constant 29 : index + %c28 = arith.constant 28 : index + %c27 = arith.constant 27 : index + %c26 = arith.constant 26 : index + %c25 = arith.constant 25 : index + %c24 = arith.constant 24 : index + %c23 = arith.constant 23 : index + %c22 = arith.constant 22 : index + %c21 = arith.constant 21 : index + %c20 = arith.constant 20 : index + %c19 = arith.constant 19 : index + %c18 = arith.constant 18 : index + %c17 = arith.constant 17 : index + %c16 = arith.constant 16 : index + %c15 = arith.constant 15 : index + %c14 = arith.constant 14 : index + %c13 = arith.constant 13 : index + %c12 = arith.constant 12 : index + %c11 = arith.constant 11 : index + %c9 = arith.constant 9 : index + %c8 = arith.constant 8 : index + %c7 = arith.constant 7 : index + %c6 = arith.constant 6 : index + %c5 = arith.constant 5 : index + %c4 = arith.constant 4 : index + %c10 = arith.constant 10 : index + %c2 = arith.constant 2 : index + %true = arith.constant true + %c1 = arith.constant {product_source = "constrain"} 1 : index + %c0 = arith.constant {product_source = "constrain"} 0 : index + %c3 = arith.constant {product_source = "constrain"} 3 : index + %felt_const_242 = felt.const 242 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %felt_const_191561942608236107294793378393788647952342390272950272 = felt.const 191561942608236107294793378393788647952342390272950272 : <"babybear"> {product_source = "constrain"} + %felt_const_4 = felt.const 4 : <"babybear"> {product_source = "constrain"} + %felt_const_18446744073709551615 = felt.const 18446744073709551615 : <"babybear"> {product_source = "constrain"} + %felt_const_18446744069414583343 = felt.const 18446744069414583343 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@p] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@reduced] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@multipleOfP] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %3 = struct.readm %arg0[@q] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %arg0[@qpProd] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %arg0[@qRangeChecks] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>> {product_source = "constrain"} + %6 = struct.readm %arg0[@qRangeChecks$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<3 x !pod.type<[@in: !felt.type<"babybear">]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@zeroCheck] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@zeroCheck$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<6 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@qpProdComp] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@qpProdComp$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@secpReducer] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@secpReducer$inputs] : <@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %13 = array.read %0[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %felt_const_18446744069414583343 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %0[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %felt_const_18446744073709551615 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %felt_const_18446744073709551615 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %felt_const_18446744073709551615 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %arg1[%24] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %12[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %0[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = felt.mul %25, %felt_const_191561942608236107294793378393788647952342390272950272 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %11[@out] : <@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %2[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.add %26, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %31 = array.read %1[%30] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %31, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = function.call @getProperRepresentation_0(%felt_const_242, %felt_const_64, %felt_const_4, %1) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<4 x !felt.type<"babybear">>) -> !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_0 = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_0[%c0] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c1] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c2] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c3] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c4] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c5] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c6] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%c7] = %felt_const_0 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %17[%24] : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_0[%26] = %25 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %nondet_1 = llzk.nondet : !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + %nondet_2 = llzk.nondet : !array.type<100 x !felt.type<"babybear">> {product_source = "constrain"} + array.write %nondet_2[%c0] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c1] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c2] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c3] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c4] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c5] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c6] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c7] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c8] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c9] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c10] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c11] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c12] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c13] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c14] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c15] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c16] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c17] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c18] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c19] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c20] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c21] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c22] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c23] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c24] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c25] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c26] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c27] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c28] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c29] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c30] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c31] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c32] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c33] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c34] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c35] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c36] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c37] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c38] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c39] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c40] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c41] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c42] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c43] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c44] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c45] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c46] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c47] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c48] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c49] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c50] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c51] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c52] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c53] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c54] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c55] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c56] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c57] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c58] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c59] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c60] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c61] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c62] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c63] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c64] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c65] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c66] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c67] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c68] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c69] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c70] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c71] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c72] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c73] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c74] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c75] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c76] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c77] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c78] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c79] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c80] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c81] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c82] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c83] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c84] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c85] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c86] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c87] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c88] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c89] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c90] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c91] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c92] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c93] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c94] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c95] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c96] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c97] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c98] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.write %nondet_2[%c99] = %felt_const_0 : <100 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + array.insert %nondet_1[%c0] = %nondet_2 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + array.insert %nondet_1[%c1] = %nondet_2 : <2,100 x !felt.type<"babybear">>, <100 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = function.call @long_div_1(%felt_const_64, %felt_const_4, %felt_const_4, %nondet_0, %0) : (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !array.type<8 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> !array.type<2,100 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %3[%24] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %6[%26] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %28 = pod.read %27[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %3[%24] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %10[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %0[%24] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %26 = pod.read %10[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %26[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %25 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %9[@out] : <@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %24[%25] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %4[%27] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c6 step %c1 { + %23 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %24 = bool.cmp lt(%23, %felt_const_4) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %24 { + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %4[%25] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %28 = array.read %1[%27] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = felt.sub %26, %28 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %8[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %25 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %4[%25] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %8[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = cast.toindex %23 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %27[%28] : <6 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %19 = pod.read %12[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4::@constrain(%11, %19) : (!struct.type<@Secp256k1PrimeReduce10Registers_4::@Secp256k1PrimeReduce10Registers_4<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %23 = array.read %5[%arg2] : <3 x !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %24 = array.read %6[%arg2] : <3 x !pod.type<[@in: !felt.type<"babybear">]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %25 = pod.read %24[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%23, %25) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + } {product_source = "constrain"} + %20 = pod.read %8[@in] : <[@in: !array.type<6 x !felt.type<"babybear">>]>, !array.type<6 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CheckCarryToZero_8::@CheckCarryToZero_8::@constrain(%7, %20) : (!struct.type<@CheckCarryToZero_8::@CheckCarryToZero_8<[]>>, !array.type<6 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %21 = pod.read %10[@a] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = pod.read %10[@b] : <[@a: !array.type<3 x !felt.type<"babybear">>, @b: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @BigMultNoCarry_6::@BigMultNoCarry_6::@constrain(%9, %21, %22) : (!struct.type<@BigMultNoCarry_6::@BigMultNoCarry_6<[]>>, !array.type<3 x !felt.type<"babybear">>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Secp256k1PointOnCurve_10 { + struct.def @Secp256k1PointOnCurve_10 { + struct.member @x3 : !array.type<10 x !felt.type<"babybear">> + struct.member @y2 : !array.type<7 x !felt.type<"babybear">> + struct.member @y2Comp : !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> + struct.member @y2Comp$inputs : !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> + struct.member @x3Comp : !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> + struct.member @x3Comp$inputs : !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> + struct.member @zeroCheck : !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> + struct.member @zeroCheck$inputs : !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<4 x !felt.type<"babybear">>) -> !struct.type<@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c7 = arith.constant 7 : index + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c10 = arith.constant {product_source = "compute"} 10 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_4 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg0[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %17 : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %20 : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @A3NoCarry_2::@A3NoCarry_2::@product(%22) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> + %24 = function.call @A3NoCarry_2::@A3NoCarry_2::@compute(%22) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %23 : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + %16 = struct.readm %15[@a3] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %16 = array.read %arg1[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %17[%18] = %16 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %17 : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %19 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %20 = arith.subi %19, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %20 : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.cmpi eq, %20, %c0 {product_source = "compute"} : index + scf.if %21 { + %22 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @A2NoCarry_3::@A2NoCarry_3::@compute(%22) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c7 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + %16 = struct.readm %15[@a2] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %16[%17] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%19] = %18 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %15 = bool.cmp eq(%14, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %15 { + %16 = array.read %nondet[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %nondet_0[%c0] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = felt.add %18, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c0] = %19 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %20 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %22 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@product(%24) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> + %26 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@compute(%24) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %25 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %16 = bool.cmp lt(%14, %felt_const_7) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %16 { + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %nondet[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %20 = array.read %nondet_0[%19] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %21 = felt.sub %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %23 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %22[%23] = %21 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %22 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %25 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %27 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %28 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@compute(%27) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %28 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + %18 = array.read %nondet[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "compute"} + array.write %19[%20] = %18 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %19 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %22 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %24 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@compute(%24) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %25 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } + } {product_source = "compute"} + struct.writem %self[@x3Comp$inputs] = %pod_3 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + struct.writem %self[@x3Comp] = %0 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + struct.writem %self[@zeroCheck$inputs] = %pod_5 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + struct.writem %self[@zeroCheck] = %1 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + struct.writem %self[@y2Comp$inputs] = %pod_1 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@y2Comp] = %2 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@x3] = %nondet : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@y2] = %nondet_0 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@x3] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %4 = struct.readm %self[@y2] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = struct.readm %self[@y2Comp] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@y2Comp$inputs] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@x3Comp] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@x3Comp$inputs] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %self[@zeroCheck] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "constrain"} + %10 = struct.readm %self[@zeroCheck$inputs] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg0[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %8[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %7[@a3] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %3[%18] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %arg1[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %6[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %17[%18] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c7 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %5[@a2] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %4[%18] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %14 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %15 = bool.cmp eq(%14, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %15 { + %16 = array.read %3[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %4[%c0] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = felt.add %18, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %10[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %16 = bool.cmp lt(%14, %felt_const_7) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %16 { + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %3[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %4[%19] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.sub %18, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %10[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %22[%23] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %17 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %3[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %10[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %14 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %11 = pod.read %8[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @A3NoCarry_2::@A3NoCarry_2::@constrain(%7, %11) : (!struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %12 = pod.read %10[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@constrain(%9, %12) : (!struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %13 = pod.read %6[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @A2NoCarry_3::@A2NoCarry_3::@constrain(%5, %13) : (!struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>> + } + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">> {llzk.pub}, %arg1: !array.type<4 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c7 = arith.constant 7 : index + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c10 = arith.constant {product_source = "compute"} 10 : index + %c4 = arith.constant {product_source = "compute"} 4 : index + %self = struct.new : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %nondet_0 = llzk.nondet : !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_1 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_2 = pod.new { @count = %c4 } : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_3 = pod.new : <[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_4 = pod.new { @count = %c10 } : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_5 = pod.new : <[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_3[@a] = %6 : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod_2[@count] : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod_2[@count] = %9 : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @A3NoCarry_2::@A3NoCarry_2::@compute(%11) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + pod.write %pod_2[@comp] = %12 : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + %5 = struct.readm %4[@a3] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%8] = %7 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c4 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg1[%4] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_1[@a] = %6 : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_1[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @A2NoCarry_3::@A2NoCarry_3::@compute(%11) : (!array.type<4 x !felt.type<"babybear">>) -> !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c7 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + %5 = struct.readm %4[@a2] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %5[%6] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet_0[%8] = %7 : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c10 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = bool.cmp eq(%3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %4 { + %5 = array.read %nondet[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet_0[%c0] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %7, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + array.write %9[%c0] = %8 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %9 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %11 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@compute(%13) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %14 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %5 = bool.cmp lt(%3, %felt_const_7) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %5 { + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet_0[%8] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %7, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %11 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %14 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %16 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %17 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@compute(%16) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %17 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } else { + %6 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %9 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %8[%9] = %7 : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_5[@in] = %8 : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %10 = pod.read %pod_4[@count] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.subi %10, %c1 {product_source = "compute"} : index + pod.write %pod_4[@count] = %11 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.cmpi eq, %11, %c0 {product_source = "compute"} : index + scf.if %12 { + %13 = pod.read %pod_5[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + %14 = function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@compute(%13) : (!array.type<10 x !felt.type<"babybear">>) -> !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + pod.write %pod_4[@comp] = %14 : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + } + } + } {product_source = "compute"} + struct.writem %self[@x3Comp$inputs] = %pod_3 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_2[@comp] : <[@count: index, @comp: !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + struct.writem %self[@x3Comp] = %0 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "compute"} + struct.writem %self[@zeroCheck$inputs] = %pod_5 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_4[@comp] : <[@count: index, @comp: !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + struct.writem %self[@zeroCheck] = %1 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "compute"} + struct.writem %self[@y2Comp$inputs] = %pod_1 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@y2Comp] = %2 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "compute"} + struct.writem %self[@x3] = %nondet : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "compute"} + struct.writem %self[@y2] = %nondet_0 : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">> {llzk.pub}, %arg2: !array.type<4 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c7 = arith.constant 7 : index + %c10 = arith.constant 10 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %felt_const_7 = felt.const 7 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@x3] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@y2] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@y2Comp] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@y2Comp$inputs] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@x3Comp] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@x3Comp$inputs] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@a: !array.type<4 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@zeroCheck] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@zeroCheck$inputs] : <@Secp256k1PointOnCurve_10::@Secp256k1PointOnCurve_10<[]>>, !pod.type<[@in: !array.type<10 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg1[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %5[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %4[@a3] : <@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %0[%15] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c4 step %c1 { + %11 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %arg2[%12] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = pod.read %3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %14[%15] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %13 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c7 step %c1 { + %11 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %2[@a2] : <@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<7 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %16 = array.read %1[%15] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %16, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c10 step %c1 { + %11 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = bool.cmp eq(%11, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %12 { + %13 = array.read %0[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %1[%c0] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.sub %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c0] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %13 = bool.cmp lt(%11, %felt_const_7) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %13 { + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <7 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } else { + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %16[%17] : <10 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + %8 = pod.read %5[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @A3NoCarry_2::@A3NoCarry_2::@constrain(%4, %8) : (!struct.type<@A3NoCarry_2::@A3NoCarry_2<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %9 = pod.read %7[@in] : <[@in: !array.type<10 x !felt.type<"babybear">>]>, !array.type<10 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9::@constrain(%6, %9) : (!struct.type<@CheckCubicModPIsZero_9::@CheckCubicModPIsZero_9<[]>>, !array.type<10 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %3[@a] : <[@a: !array.type<4 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @A2NoCarry_3::@A2NoCarry_3::@constrain(%2, %10) : (!struct.type<@A2NoCarry_3::@A2NoCarry_3<[]>>, !array.type<4 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/theta_test.llzk b/examples/circom-demo/theta_test.llzk new file mode 100644 index 0000000..1daa7f4 --- /dev/null +++ b/examples/circom-demo/theta_test.llzk @@ -0,0 +1,7639 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@Theta_9::@Theta_9<[]>>} { + poly.template @Xor3_0 { + struct.def @Xor3_0 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @mid : !array.type<64 x !felt.type<"babybear">> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@Xor3_0::@Xor3_0<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg3 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg1[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet_0[%6] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = cast.toindex %0 : !felt.type<"babybear"> + %8 = array.read %arg0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %0 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.mul %10, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = felt.sub %felt_const_1, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %arg2[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %14, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.sub %12, %15 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = cast.toindex %0 : !felt.type<"babybear"> + %18 = array.read %nondet_0[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.mul %18, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = felt.add %16, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = felt.mul %8, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = cast.toindex %0 : !felt.type<"babybear"> + %23 = array.read %arg1[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.add %21, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %0 : !felt.type<"babybear"> + %26 = array.read %arg2[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %0 : !felt.type<"babybear"> + %29 = array.read %nondet_0[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.mul %29, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = felt.sub %27, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%32] = %31 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@mid] = %nondet_0 : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Xor3_0::@Xor3_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Xor3_0::@Xor3_0<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_4 = felt.const 4 : <"babybear"> + %felt_const_2 = felt.const 2 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@mid] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg4 = %c0 to %c64 step %c1 { + %2 = cast.tofelt %arg4 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg2[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %2 : !felt.type<"babybear"> + %6 = array.read %arg3[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.mul %4, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = cast.toindex %2 : !felt.type<"babybear"> + %9 = array.read %1[%8] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = cast.toindex %2 : !felt.type<"babybear"> + %11 = array.read %arg1[%10] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = cast.toindex %2 : !felt.type<"babybear"> + %13 = array.read %arg2[%12] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = felt.mul %13, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %15 = felt.sub %felt_const_1, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = cast.toindex %2 : !felt.type<"babybear"> + %17 = array.read %arg3[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.mul %17, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = felt.sub %15, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %2 : !felt.type<"babybear"> + %21 = array.read %1[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %21, %felt_const_4 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = felt.add %19, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = felt.mul %11, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %2 : !felt.type<"babybear"> + %26 = array.read %arg2[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.add %24, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = cast.toindex %2 : !felt.type<"babybear"> + %29 = array.read %arg3[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.add %27, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = cast.toindex %2 : !felt.type<"babybear"> + %32 = array.read %1[%31] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = felt.mul %32, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %34 = felt.sub %30, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = cast.toindex %2 : !felt.type<"babybear"> + %36 = array.read %0[%35] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %36, %34 : !felt.type<"babybear">, !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @XOR_1 { + struct.def @XOR_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %felt_const_2 = felt.const 2 : <"babybear"> + %self = struct.new : <@XOR_1::@XOR_1<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %3 : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@XOR_1::@XOR_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@XOR_1::@XOR_1<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %felt_const_2 = felt.const 2 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %felt_const_2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.sub %1, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @XorArray_2 { + struct.def @XorArray_2 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@XorArray_2::@XorArray_2<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @XOR_1::@XOR_1::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@XOR_1::@XOR_1<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = struct.readm %3[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@XOR_1::@XOR_1<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@XOR_1::@XOR_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@XOR_1::@XOR_1<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + } + struct.writem %self[@aux] = %array_1 : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + struct.writem %self[@out] = %nondet : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@XorArray_2::@XorArray_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@XorArray_2::@XorArray_2<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !struct.type<@XOR_1::@XOR_1<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %6 = struct.readm %5[@out] : <@XOR_1::@XOR_1<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@XOR_1::@XOR_1<[]>>>, !struct.type<@XOR_1::@XOR_1<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @XOR_1::@XOR_1::@constrain(%3, %5, %6) : (!struct.type<@XOR_1::@XOR_1<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @Xor5_3 { + struct.def @Xor5_3 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @xor5 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @xor5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @xor3 : !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.member @xor3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + struct.member @xor4 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @xor4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>, %arg4: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c192 = arith.constant 192 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@Xor5_3::@Xor5_3<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c192 } : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %6 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod_1[@count] = %9 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod_1[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %3 : !felt.type<"babybear"> + array.write %13[%14] = %12 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %13 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %16 = arith.subi %15, %c1 : index + pod.write %pod_1[@count] = %16 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.cmpi eq, %16, %c0 : index + scf.if %17 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod_1[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + %18 = cast.toindex %3 : !felt.type<"babybear"> + %19 = array.read %arg2[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = cast.toindex %3 : !felt.type<"babybear"> + array.write %20[%21] = %19 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@c] = %20 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %23 = arith.subi %22, %c1 : index + pod.write %pod_1[@count] = %23 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, index + %24 = arith.cmpi eq, %23, %c0 : index + scf.if %24 { + %25 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %27 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = function.call @Xor3_0::@Xor3_0::@compute(%25, %26, %27) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor3_0::@Xor3_0<[]>> + pod.write %pod_1[@comp] = %28 : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + %5 = struct.readm %4[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod_3[@count] = %11 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg3[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod_3[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_3[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = cast.toindex %3 : !felt.type<"babybear"> + array.write %8[%9] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %8 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.subi %10, %c1 : index + pod.write %pod[@count] = %11 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.cmpi eq, %11, %c0 : index + scf.if %12 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %13 = cast.toindex %3 : !felt.type<"babybear"> + %14 = array.read %arg4[%13] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %3 : !felt.type<"babybear"> + array.write %15[%16] = %14 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %15 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.subi %17, %c1 : index + pod.write %pod[@count] = %18 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.cmpi eq, %18, %c0 : index + scf.if %19 { + %20 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %21 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = function.call @XorArray_2::@XorArray_2::@compute(%20, %21) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod[@comp] = %22 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg5 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg5 : index, !felt.type<"babybear"> + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %5 = struct.readm %4[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %5[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = cast.toindex %3 : !felt.type<"babybear"> + array.write %nondet[%8] = %7 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@xor5$inputs] = %pod_0 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor5] = %0 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor4$inputs] = %pod_4 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor4] = %1 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@xor3$inputs] = %pod_2 : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor3_0::@Xor3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.writem %self[@xor3] = %2 : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@Xor3_0::@Xor3_0<[]>> + struct.writem %self[@out] = %nondet : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@Xor5_3::@Xor5_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Xor5_3::@Xor5_3<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>, %arg3: !array.type<64 x !felt.type<"babybear">>, %arg4: !array.type<64 x !felt.type<"babybear">>, %arg5: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@xor5] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %2 = struct.readm %arg0[@xor5$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@xor3] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@Xor3_0::@Xor3_0<[]>> + %4 = struct.readm %arg0[@xor3$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@xor4] : <@Xor5_3::@Xor5_3<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %6 = struct.readm %arg0[@xor4$inputs] : <@Xor5_3::@Xor5_3<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = cast.toindex %14 : !felt.type<"babybear"> + %16 = array.read %arg1[%15] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = cast.toindex %14 : !felt.type<"babybear"> + %19 = array.read %17[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = cast.toindex %14 : !felt.type<"babybear"> + %21 = array.read %arg2[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = cast.toindex %14 : !felt.type<"babybear"> + %24 = array.read %22[%23] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %24, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = cast.toindex %14 : !felt.type<"babybear"> + %26 = array.read %arg3[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %28 = cast.toindex %14 : !felt.type<"babybear"> + %29 = array.read %27[%28] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %3[@out] : <@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg4[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = array.read %23[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %14 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = cast.toindex %14 : !felt.type<"babybear"> + %22 = array.read %arg5[%21] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = cast.toindex %14 : !felt.type<"babybear"> + %25 = array.read %23[%24] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg6 = %c0 to %c64 step %c1 { + %14 = cast.tofelt %arg6 : index, !felt.type<"babybear"> + %15 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %14 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = cast.toindex %14 : !felt.type<"babybear"> + %19 = array.read %0[%18] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%1, %7, %8) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %9 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%5, %9, %10) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %11 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @Xor3_0::@Xor3_0::@constrain(%3, %11, %12, %13) : (!struct.type<@Xor3_0::@Xor3_0<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @ShR_4 { + struct.def @ShR_4 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %self = struct.new : <@ShR_4::@ShR_4<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = felt.add %0, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = bool.cmp ge(%1, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%3] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %3 = array.read %arg0[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet[%c0] = %3 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShR_4::@ShR_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShR_4::@ShR_4<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c63 = arith.constant 63 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_63 = felt.const 63 : <"babybear"> + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = felt.add %1, %felt_const_63 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = bool.cmp ge(%2, %felt_const_64) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %3 { + %4 = cast.toindex %1 : !felt.type<"babybear"> + %5 = array.read %0[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %4 = array.read %arg1[%c63] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %5, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @ShL_5 { + struct.def @ShL_5 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@ShL_5::@ShL_5<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + scf.for %arg1 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %1 = bool.cmp lt(%0, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %1 { + array.write %nondet[%c0] = %felt_const_0 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } else { + %2 = felt.sub %0, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + } + struct.writem %self[@out] = %nondet : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@ShL_5::@ShL_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@ShL_5::@ShL_5<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + scf.for %arg2 = %c0 to %c64 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %2 = bool.cmp lt(%1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.if %2 { + %3 = array.read %0[%c0] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %3, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> + } else { + %3 = felt.sub %1, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %1 : !felt.type<"babybear"> + %7 = array.read %0[%6] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + } + function.return + } + } + } + poly.template @OR_6 { + struct.def @OR_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !felt.type<"babybear">, %arg1: !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %self = struct.new : <@OR_6::@OR_6<[]>> + %0 = felt.add %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %1 = felt.mul %arg0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@OR_6::@OR_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@OR_6::@OR_6<[]>>, %arg1: !felt.type<"babybear">, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %0 = struct.readm %arg0[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %1 = felt.add %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %2 = felt.mul %arg1, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @OrArray_7 { + struct.def @OrArray_7 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux : !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + struct.member @aux$inputs : !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@OrArray_7::@OrArray_7<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %array = array.new : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + pod.write %0[@count] = %c2 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + array.write %array[%arg2] = %0 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + %array_0 = array.new : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %arg0[%1] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = cast.toindex %0 : !felt.type<"babybear"> + %4 = array.read %array_0[%3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %4[@a] = %2 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%5] = %4 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %6 = cast.toindex %0 : !felt.type<"babybear"> + %7 = array.read %array[%6] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %8 = pod.read %7[@count] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %7[@count] = %9 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %21 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_6::@OR_6::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> + pod.write %7[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %7 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + %11 = cast.toindex %0 : !felt.type<"babybear"> + %12 = array.read %arg1[%11] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = cast.toindex %0 : !felt.type<"babybear"> + %14 = array.read %array_0[%13] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + pod.write %14[@b] = %12 : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %15 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array_0[%15] = %14 : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %16 = cast.toindex %0 : !felt.type<"babybear"> + %17 = array.read %array[%16] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %18 = pod.read %17[@count] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %17[@count] = %19 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %14[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %22 = pod.read %14[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %23 = function.call @OR_6::@OR_6::@compute(%21, %22) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !struct.type<@OR_6::@OR_6<[]>> + pod.write %17[@comp] = %23 : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %24 = cast.toindex %0 : !felt.type<"babybear"> + array.write %array[%24] = %17 : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %1 = cast.toindex %0 : !felt.type<"babybear"> + %2 = array.read %array[%1] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %3 = pod.read %2[@comp] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + %4 = struct.readm %3[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %5 = cast.toindex %0 : !felt.type<"babybear"> + array.write %nondet[%5] = %4 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux$inputs] = %array_0 : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + %array_1 = array.new : <64 x !struct.type<@OR_6::@OR_6<[]>>> + scf.for %arg2 = %c0 to %c64 step %c1 { + %0 = array.read %array[%arg2] : <64 x !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>>, !pod.type<[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]> + %1 = pod.read %0[@comp] : <[@count: index, @comp: !struct.type<@OR_6::@OR_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@OR_6::@OR_6<[]>> + array.write %array_1[%arg2] = %1 : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + } + struct.writem %self[@aux] = %array_1 : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + struct.writem %self[@out] = %nondet : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@OrArray_7::@OrArray_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@OrArray_7::@OrArray_7<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %c64 = arith.constant 64 : index + %0 = struct.readm %arg0[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !struct.type<@OR_6::@OR_6<[]>>> + %2 = struct.readm %arg0[@aux$inputs] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>> + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg1[%4] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = cast.toindex %3 : !felt.type<"babybear"> + %7 = array.read %2[%6] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %8 = pod.read %7[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %9 = cast.toindex %3 : !felt.type<"babybear"> + %10 = array.read %arg2[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = cast.toindex %3 : !felt.type<"babybear"> + %12 = array.read %2[%11] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %13 = pod.read %12[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %1[%4] : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + %6 = struct.readm %5[@out] : <@OR_6::@OR_6<[]>>, !felt.type<"babybear"> + %7 = cast.toindex %3 : !felt.type<"babybear"> + %8 = array.read %0[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %8, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %3 = array.read %1[%arg3] : <64 x !struct.type<@OR_6::@OR_6<[]>>>, !struct.type<@OR_6::@OR_6<[]>> + %4 = array.read %2[%arg3] : <64 x !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>>, !pod.type<[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]> + %5 = pod.read %4[@a] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + %6 = pod.read %4[@b] : <[@a: !felt.type<"babybear">, @b: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @OR_6::@OR_6::@constrain(%3, %5, %6) : (!struct.type<@OR_6::@OR_6<[]>>, !felt.type<"babybear">, !felt.type<"babybear">) -> () + } + function.return + } + } + } + poly.template @D_8 { + struct.def @D_8 { + struct.member @out : !array.type<64 x !felt.type<"babybear">> {llzk.pub} + struct.member @aux2 : !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.member @aux2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux3 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @aux3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux1 : !struct.type<@ShL_5::@ShL_5<[]>> + struct.member @aux1$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @aux0 : !struct.type<@ShR_4::@ShR_4<[]>> + struct.member @aux0$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>, %arg1: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c128 = arith.constant 128 : index + %self = struct.new : <@D_8::@D_8<[]>> + %nondet = llzk.nondet : !array.type<64 x !felt.type<"babybear">> + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %pod_3 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]> + %pod_4 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_5 = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]> + %pod_6 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_6[@in] = %7 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_5[@count] = %10 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = function.call @ShR_4::@ShR_4::@compute(%12) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShR_4::@ShR_4<[]>> + pod.write %pod_5[@comp] = %13 : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_4[@in] = %7 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_3[@count] = %10 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_4[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %13 = function.call @ShL_5::@ShL_5::@compute(%12) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@ShL_5::@ShL_5<[]>> + pod.write %pod_3[@comp] = %13 : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + %6 = struct.readm %5[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %10 = cast.toindex %4 : !felt.type<"babybear"> + array.write %9[%10] = %8 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@a] = %9 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %11 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %12 = arith.subi %11, %c1 : index + pod.write %pod[@count] = %12 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.cmpi eq, %12, %c0 : index + scf.if %13 { + %23 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = function.call @OrArray_7::@OrArray_7::@compute(%23, %24) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + %14 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + %15 = struct.readm %14[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %4 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %4 : !felt.type<"babybear"> + array.write %18[%19] = %17 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@b] = %18 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %21 = arith.subi %20, %c1 : index + pod.write %pod[@count] = %21 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, index + %22 = arith.cmpi eq, %21, %c0 : index + scf.if %22 { + %23 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %24 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = function.call @OrArray_7::@OrArray_7::@compute(%23, %24) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@OrArray_7::@OrArray_7<[]>> + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@a] = %7 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %9 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod_1[@count] = %10 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %21 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = function.call @XorArray_2::@XorArray_2::@compute(%21, %22) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + %12 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %13 = struct.readm %12[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %14 = cast.toindex %4 : !felt.type<"babybear"> + %15 = array.read %13[%14] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %4 : !felt.type<"babybear"> + array.write %16[%17] = %15 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@b] = %16 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %18 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %19 = arith.subi %18, %c1 : index + pod.write %pod_1[@count] = %19 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index + %20 = arith.cmpi eq, %19, %c0 : index + scf.if %20 { + %21 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %22 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %23 = function.call @XorArray_2::@XorArray_2::@compute(%21, %22) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> + pod.write %pod_1[@comp] = %23 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + } + } + scf.for %arg2 = %c0 to %c64 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %6 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %7 = cast.toindex %4 : !felt.type<"babybear"> + %8 = array.read %6[%7] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = cast.toindex %4 : !felt.type<"babybear"> + array.write %nondet[%9] = %8 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + } + struct.writem %self[@aux1$inputs] = %pod_4 : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@ShL_5::@ShL_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@aux1] = %0 : <@D_8::@D_8<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + struct.writem %self[@aux0$inputs] = %pod_6 : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %1 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@ShR_4::@ShR_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux0] = %1 : <@D_8::@D_8<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + struct.writem %self[@aux3$inputs] = %pod_2 : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %2 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@aux3] = %2 : <@D_8::@D_8<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.writem %self[@aux2$inputs] = %pod_0 : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@OrArray_7::@OrArray_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@aux2] = %3 : <@D_8::@D_8<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + struct.writem %self[@out] = %nondet : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> + function.return %self : !struct.type<@D_8::@D_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@D_8::@D_8<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>, %arg2: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@aux2] : <@D_8::@D_8<[]>>, !struct.type<@OrArray_7::@OrArray_7<[]>> + %2 = struct.readm %arg0[@aux2$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@aux3] : <@D_8::@D_8<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> + %4 = struct.readm %arg0[@aux3$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + %5 = struct.readm %arg0[@aux1] : <@D_8::@D_8<[]>>, !struct.type<@ShL_5::@ShL_5<[]>> + %6 = struct.readm %arg0[@aux1$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %7 = struct.readm %arg0[@aux0] : <@D_8::@D_8<[]>>, !struct.type<@ShR_4::@ShR_4<[]>> + %8 = struct.readm %arg0[@aux0$inputs] : <@D_8::@D_8<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %8[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg1[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = struct.readm %7[@out] : <@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %15 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = cast.toindex %15 : !felt.type<"babybear"> + %21 = array.read %19[%20] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = struct.readm %5[@out] : <@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">> + %23 = cast.toindex %15 : !felt.type<"babybear"> + %24 = array.read %22[%23] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %26 = cast.toindex %15 : !felt.type<"babybear"> + %27 = array.read %25[%26] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %27, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = cast.toindex %15 : !felt.type<"babybear"> + %17 = array.read %arg2[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %18[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = struct.readm %1[@out] : <@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">> + %22 = cast.toindex %15 : !felt.type<"babybear"> + %23 = array.read %21[%22] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %25 = cast.toindex %15 : !felt.type<"babybear"> + %26 = array.read %24[%25] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %26, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c64 step %c1 { + %15 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %16 = struct.readm %3[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> + %17 = cast.toindex %15 : !felt.type<"babybear"> + %18 = array.read %16[%17] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = cast.toindex %15 : !felt.type<"babybear"> + %20 = array.read %0[%19] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %9 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShL_5::@ShL_5::@constrain(%5, %9) : (!struct.type<@ShL_5::@ShL_5<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %10 = pod.read %8[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @ShR_4::@ShR_4::@constrain(%7, %10) : (!struct.type<@ShR_4::@ShR_4<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + %11 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %12 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @XorArray_2::@XorArray_2::@constrain(%3, %11, %12) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + %13 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %14 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @OrArray_7::@OrArray_7::@constrain(%1, %13, %14) : (!struct.type<@OrArray_7::@OrArray_7<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Theta_9 { + struct.def @Theta_9 { + struct.member @out : !array.type<1600 x !felt.type<"babybear">> {llzk.pub} + struct.member @r3 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c0 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r5 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r5$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r24 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r24$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c2 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r22 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r22$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r20 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r20$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r18 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r18$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r0 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d3 : !struct.type<@D_8::@D_8<[]>> + struct.member @d3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r11 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r11$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c3 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c3$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r21 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r21$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r8 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r8$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d1 : !struct.type<@D_8::@D_8<[]>> + struct.member @d1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r19 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r19$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r2 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d0 : !struct.type<@D_8::@D_8<[]>> + struct.member @d0$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r7 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r7$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r13 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r13$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r15 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r15$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r16 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r16$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r12 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r12$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c4 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r17 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r17$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r23 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r23$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r4 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d4 : !struct.type<@D_8::@D_8<[]>> + struct.member @d4$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r1 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r6 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r6$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @d2 : !struct.type<@D_8::@D_8<[]>> + struct.member @d2$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r9 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r9$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r14 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r14$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @r10 : !struct.type<@XorArray_2::@XorArray_2<[]>> + struct.member @r10$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> + struct.member @c1 : !struct.type<@Xor5_3::@Xor5_3<[]>> + struct.member @c1$inputs : !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c320 = arith.constant {product_source = "compute"} 320 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_49 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_50 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_51 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_52 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_53 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_54 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_55 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_56 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_57 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_58 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_59 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_60 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_61 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_62 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_63 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_64 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_65 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_66 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_67 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_68 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %194 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %194[%195] = %193 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %194 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %197 = arith.subi %196, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %197 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.cmpi eq, %197, %c0 {product_source = "compute"} : index + scf.if %198 { + %231 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %199 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %200 = cast.toindex %199 : !felt.type<"babybear"> {product_source = "compute"} + %201 = array.read %arg0[%200] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %202 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %202[%203] = %201 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %202 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %205 = arith.subi %204, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %205 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.cmpi eq, %205, %c0 {product_source = "compute"} : index + scf.if %206 { + %231 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %207 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %208 = cast.toindex %207 : !felt.type<"babybear"> {product_source = "compute"} + %209 = array.read %arg0[%208] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %210 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %210[%211] = %209 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %210 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %213 = arith.subi %212, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %213 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.cmpi eq, %213, %c0 {product_source = "compute"} : index + scf.if %214 { + %231 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %215 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "compute"} + %217 = array.read %arg0[%216] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %218 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %219 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %218[%219] = %217 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@d] = %218 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %221 = arith.subi %220, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %221 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.cmpi eq, %221, %c0 {product_source = "compute"} : index + scf.if %222 { + %231 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %223 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %224 = cast.toindex %223 : !felt.type<"babybear"> {product_source = "compute"} + %225 = array.read %arg0[%224] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %226 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %227 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %226[%227] = %225 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@e] = %226 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %229 = arith.subi %228, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %229 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.cmpi eq, %229, %c0 {product_source = "compute"} : index + scf.if %230 { + %231 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %232 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = function.call @Xor5_3::@Xor5_3::@compute(%231, %232, %233, %234, %235) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %236 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %198 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %232 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %201 = cast.toindex %200 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %arg0[%201] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %206 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %232 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %208 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %209 = cast.toindex %208 : !felt.type<"babybear"> {product_source = "compute"} + %210 = array.read %arg0[%209] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %211 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %211[%212] = %210 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %211 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %213 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %214 = arith.subi %213, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %214 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %215 = arith.cmpi eq, %214, %c0 {product_source = "compute"} : index + scf.if %215 { + %232 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %216 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "compute"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %219 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %219[%220] = %218 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@d] = %219 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %221 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %222 = arith.subi %221, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %222 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %223 = arith.cmpi eq, %222, %c0 {product_source = "compute"} : index + scf.if %223 { + %232 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %224 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %225 = cast.toindex %224 : !felt.type<"babybear"> {product_source = "compute"} + %226 = array.read %arg0[%225] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %227 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %228 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %227[%228] = %226 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@e] = %227 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %229 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %230 = arith.subi %229, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %230 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %231 = arith.cmpi eq, %230, %c0 {product_source = "compute"} : index + scf.if %231 { + %232 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %233 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %234 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %235 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %236 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %237 = function.call @Xor5_3::@Xor5_3::@compute(%232, %233, %234, %235, %236) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %237 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %194 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %194[%195] = %193 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %194 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %197 = arith.subi %196, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %197 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.cmpi eq, %197, %c0 {product_source = "compute"} : index + scf.if %198 { + %208 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %209 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = function.call @XorArray_2::@XorArray_2::@compute(%208, %209) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %210 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %199 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %200 = struct.readm %199[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %203 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %204 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %203[%204] = %202 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %203 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %206 = arith.subi %205, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %206 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.cmpi eq, %206, %c0 {product_source = "compute"} : index + scf.if %207 { + %208 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %209 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = function.call @XorArray_2::@XorArray_2::@compute(%208, %209) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %210 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%196] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %196[%197] = %195 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@a] = %196 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %198 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.subi %198, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %199 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %200 = arith.cmpi eq, %199, %c0 {product_source = "compute"} : index + scf.if %200 { + %210 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %201 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %202 = struct.readm %201[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %203 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %204 = array.read %202[%203] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %205 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %205[%206] = %204 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@b] = %205 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %207 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.subi %207, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %208 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %209 = arith.cmpi eq, %208, %c0 {product_source = "compute"} : index + scf.if %209 { + %210 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %212 = function.call @D_8::@D_8::@compute(%210, %211) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %212 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "compute"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %195 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %195[%196] = %194 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %195 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %197 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %198 = arith.subi %197, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %198 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %199 = arith.cmpi eq, %198, %c0 {product_source = "compute"} : index + scf.if %199 { + %209 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %200 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %201 = struct.readm %200[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %204 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %205 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + array.write %204[%205] = %203 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %204 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %206 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %207 = arith.subi %206, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %207 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %208 = arith.cmpi eq, %207, %c0 {product_source = "compute"} : index + scf.if %208 { + %209 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %210 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %211 = function.call @XorArray_2::@XorArray_2::@compute(%209, %210) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %211 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %192 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %193 = struct.readm %192[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %194 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "compute"} + %195 = array.read %193[%194] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %196 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %197 = cast.toindex %196 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%197] = %195 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@c4$inputs] = %pod_46 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c4] = %0 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_48 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %1 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_26 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %2 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_4 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %3 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c3$inputs] = %pod_22 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3] = %4 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_24 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %5 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_10 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %6 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d1$inputs] = %pod_28 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d1] = %7 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_52 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %8 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_50 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %9 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_6 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %10 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_36 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %11 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_14 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %12 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_16 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %13 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_20 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %14 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c0$inputs] = %pod_2 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c0] = %15 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_30 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %16 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d2$inputs] = %pod_60 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d2] = %17 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_12 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %18 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_0 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %19 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_66 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %20 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_62 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %21 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_64 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %22 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c1$inputs] = %pod_68 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c1] = %23 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_42 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %24 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_44 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %25 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d4$inputs] = %pod_54 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d4] = %26 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0$inputs] = %pod_34 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0] = %27 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c2$inputs] = %pod_8 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2] = %28 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_56 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %29 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d3$inputs] = %pod_18 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d3] = %30 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_58 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %31 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_38 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %32 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_32 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %33 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_40 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %34 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %35 = struct.readm %self[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %36 = struct.readm %self[@r3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@r3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %38 = struct.readm %self[@c0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %39 = struct.readm %self[@c0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %40 = struct.readm %self[@r5] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %41 = struct.readm %self[@r5$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %42 = struct.readm %self[@r24] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %43 = struct.readm %self[@r24$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %44 = struct.readm %self[@c2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@c2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@r22] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@r22$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@r20] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@r20$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@r18] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@r18$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %52 = struct.readm %self[@r0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %53 = struct.readm %self[@r0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %54 = struct.readm %self[@d3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %55 = struct.readm %self[@d3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %56 = struct.readm %self[@r11] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %57 = struct.readm %self[@r11$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %58 = struct.readm %self[@c3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %59 = struct.readm %self[@c3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %60 = struct.readm %self[@r21] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %61 = struct.readm %self[@r21$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %62 = struct.readm %self[@r8] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %63 = struct.readm %self[@r8$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %64 = struct.readm %self[@d1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %65 = struct.readm %self[@d1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %66 = struct.readm %self[@r19] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %67 = struct.readm %self[@r19$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %68 = struct.readm %self[@r2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %69 = struct.readm %self[@r2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %70 = struct.readm %self[@d0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %71 = struct.readm %self[@d0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %72 = struct.readm %self[@r7] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %73 = struct.readm %self[@r7$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %74 = struct.readm %self[@r13] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %75 = struct.readm %self[@r13$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %76 = struct.readm %self[@r15] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %77 = struct.readm %self[@r15$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %78 = struct.readm %self[@r16] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %79 = struct.readm %self[@r16$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %80 = struct.readm %self[@r12] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %81 = struct.readm %self[@r12$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %82 = struct.readm %self[@c4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %83 = struct.readm %self[@c4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %84 = struct.readm %self[@r17] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %85 = struct.readm %self[@r17$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %86 = struct.readm %self[@r23] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %87 = struct.readm %self[@r23$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %88 = struct.readm %self[@r4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %89 = struct.readm %self[@r4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %90 = struct.readm %self[@d4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %91 = struct.readm %self[@d4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %92 = struct.readm %self[@r1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %93 = struct.readm %self[@r1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %94 = struct.readm %self[@r6] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %95 = struct.readm %self[@r6$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %96 = struct.readm %self[@d2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %97 = struct.readm %self[@d2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %98 = struct.readm %self[@r9] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %99 = struct.readm %self[@r9$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %100 = struct.readm %self[@r14] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %101 = struct.readm %self[@r14$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %102 = struct.readm %self[@r10] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %103 = struct.readm %self[@r10$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %104 = struct.readm %self[@c1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %105 = struct.readm %self[@c1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %194 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %193 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = cast.toindex %197 : !felt.type<"babybear"> {product_source = "constrain"} + %199 = array.read %arg0[%198] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %200 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %202, %199 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %203 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = cast.toindex %203 : !felt.type<"babybear"> {product_source = "constrain"} + %205 = array.read %arg0[%204] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %206 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %207 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %208 = array.read %206[%207] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %208, %205 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %209 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = cast.toindex %209 : !felt.type<"babybear"> {product_source = "constrain"} + %211 = array.read %arg0[%210] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %212 = pod.read %39[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %213 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %214 = array.read %212[%213] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %214, %211 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %215 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = cast.toindex %215 : !felt.type<"babybear"> {product_source = "constrain"} + %217 = array.read %arg0[%216] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %218 = pod.read %39[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %219 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %220 = array.read %218[%219] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %220, %217 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %105[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %105[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %105[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %105[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %105[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %45[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %45[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %59[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %59[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %83[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %199 = cast.toindex %198 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %arg0[%199] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %83[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %204 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %205 = cast.toindex %204 : !felt.type<"babybear"> {product_source = "constrain"} + %206 = array.read %arg0[%205] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %207 = pod.read %83[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %208 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %209 = array.read %207[%208] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %209, %206 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %210 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %211 = cast.toindex %210 : !felt.type<"babybear"> {product_source = "constrain"} + %212 = array.read %arg0[%211] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %213 = pod.read %83[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %214 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %215 = array.read %213[%214] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %215, %212 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %216 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %217 = cast.toindex %216 : !felt.type<"babybear"> {product_source = "constrain"} + %218 = array.read %arg0[%217] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %219 = pod.read %83[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %220 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %221 = array.read %219[%220] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %221, %218 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %104[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %82[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %193 = array.read %arg0[%192] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %194 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %194[%195] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %193 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %197 = struct.readm %70[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %198 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %199 = array.read %197[%198] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %200 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %201 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %202 = array.read %200[%201] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %202, %199 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %52[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %196 = array.read %35[%195] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %196, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %70[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %40[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %103[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %70[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %103[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %102[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %77[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %70[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %77[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %76[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %70[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %48[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %44[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %38[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %93[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %64[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %93[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %92[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %95[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %64[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %95[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %94[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %64[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %56[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %79[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %64[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %79[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %78[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %64[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %60[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %58[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %97[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %104[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %97[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %68[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %72[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %81[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %81[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %80[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %85[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %85[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %84[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %96[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %46[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %82[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %44[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %54[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %54[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %62[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %54[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %74[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %54[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %50[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %87[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %54[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %87[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %86[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %38[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %91[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %58[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %91[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %89[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %90[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %89[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %88[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %99[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %90[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %99[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %98[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %101[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %90[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %101[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %100[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %90[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %66[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %193 = cast.toindex %192 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %arg0[%193] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %196 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %195[%196] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %198 = struct.readm %90[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %199 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %200 = array.read %198[%199] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %201 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %202 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %203 = array.read %201[%202] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %203, %200 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %191 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %192 = struct.readm %42[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %193 = cast.toindex %191 : !felt.type<"babybear"> {product_source = "constrain"} + %194 = array.read %192[%193] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %195 = felt.add %191, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %196 = cast.toindex %195 : !felt.type<"babybear"> {product_source = "constrain"} + %197 = array.read %35[%196] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %197, %194 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %106 = pod.read %83[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %107 = pod.read %83[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %108 = pod.read %83[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %83[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %83[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%82, %106, %107, %108, %109, %110) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %111 = pod.read %85[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %112 = pod.read %85[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%84, %111, %112) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %113 = pod.read %63[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %114 = pod.read %63[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%62, %113, %114) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %115 = pod.read %41[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %116 = pod.read %41[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%40, %115, %116) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %117 = pod.read %59[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %118 = pod.read %59[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %59[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %120 = pod.read %59[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %59[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%58, %117, %118, %119, %120, %121) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %122 = pod.read %61[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %61[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%60, %122, %123) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %124 = pod.read %47[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %47[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%46, %124, %125) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %126 = pod.read %65[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = pod.read %65[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%64, %126, %127) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %128 = pod.read %89[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %89[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%88, %128, %129) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %130 = pod.read %87[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %131 = pod.read %87[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%86, %130, %131) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %132 = pod.read %43[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %133 = pod.read %43[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%42, %132, %133) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %134 = pod.read %73[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %135 = pod.read %73[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%72, %134, %135) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %136 = pod.read %51[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %137 = pod.read %51[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%50, %136, %137) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %138 = pod.read %53[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %139 = pod.read %53[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%52, %138, %139) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %140 = pod.read %57[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %57[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%56, %140, %141) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %142 = pod.read %39[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %39[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %144 = pod.read %39[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = pod.read %39[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %146 = pod.read %39[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%38, %142, %143, %144, %145, %146) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %147 = pod.read %67[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %148 = pod.read %67[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%66, %147, %148) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %149 = pod.read %97[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %150 = pod.read %97[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%96, %149, %150) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %151 = pod.read %49[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %152 = pod.read %49[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%48, %151, %152) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %153 = pod.read %37[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %154 = pod.read %37[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%36, %153, %154) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %155 = pod.read %103[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %156 = pod.read %103[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%102, %155, %156) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %157 = pod.read %99[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = pod.read %99[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%98, %157, %158) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %159 = pod.read %101[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = pod.read %101[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%100, %159, %160) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %161 = pod.read %105[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %162 = pod.read %105[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = pod.read %105[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = pod.read %105[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %165 = pod.read %105[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%104, %161, %162, %163, %164, %165) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %166 = pod.read %79[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = pod.read %79[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%78, %166, %167) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %168 = pod.read %81[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %169 = pod.read %81[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%80, %168, %169) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %170 = pod.read %91[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %171 = pod.read %91[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%90, %170, %171) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %172 = pod.read %71[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = pod.read %71[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%70, %172, %173) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %174 = pod.read %45[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %175 = pod.read %45[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %176 = pod.read %45[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %177 = pod.read %45[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %178 = pod.read %45[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%44, %174, %175, %176, %177, %178) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %179 = pod.read %93[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %180 = pod.read %93[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%92, %179, %180) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %181 = pod.read %55[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %182 = pod.read %55[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%54, %181, %182) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %183 = pod.read %95[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %184 = pod.read %95[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%94, %183, %184) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %185 = pod.read %75[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %186 = pod.read %75[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%74, %185, %186) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %187 = pod.read %69[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %188 = pod.read %69[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%68, %187, %188) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %189 = pod.read %77[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %190 = pod.read %77[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%76, %189, %190) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@Theta_9::@Theta_9<[]>> + } + function.def @compute(%arg0: !array.type<1600 x !felt.type<"babybear">>) -> !struct.type<@Theta_9::@Theta_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c64 = arith.constant 64 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "compute"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "compute"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "compute"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "compute"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "compute"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "compute"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "compute"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "compute"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "compute"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "compute"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "compute"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "compute"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "compute"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "compute"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "compute"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "compute"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "compute"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "compute"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "compute"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "compute"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "compute"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c320 = arith.constant {product_source = "compute"} 320 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@Theta_9::@Theta_9<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_7 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_8 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_9 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_10 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_11 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_12 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_13 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_14 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_15 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_16 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_17 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_18 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_19 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_20 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_21 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_22 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_23 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_24 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_25 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_26 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_27 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_28 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_29 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_30 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_31 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_32 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_33 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_34 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_35 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_36 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_37 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_38 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_39 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_40 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_41 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_42 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_43 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_44 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_45 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_46 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_47 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_48 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_49 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_50 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_51 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_52 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_53 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_54 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_55 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_56 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_57 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_58 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_59 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_60 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_61 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_62 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_63 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_64 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_65 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_66 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_67 = pod.new { @count = %c320 } : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_68 = pod.new : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg0[%36] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@a] = %38 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %41 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %75 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %43 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@b] = %46 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %49 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %75 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %51 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %52 = cast.toindex %51 : !felt.type<"babybear"> {product_source = "compute"} + %53 = array.read %arg0[%52] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %54 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %54[%55] = %53 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %54 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.subi %56, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %57 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.cmpi eq, %57, %c0 {product_source = "compute"} : index + scf.if %58 { + %75 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %59 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %60 = cast.toindex %59 : !felt.type<"babybear"> {product_source = "compute"} + %61 = array.read %arg0[%60] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %62 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %63 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %62[%63] = %61 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@d] = %62 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %65 = arith.subi %64, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %65 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.cmpi eq, %65, %c0 {product_source = "compute"} : index + scf.if %66 { + %75 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %67 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %68 = cast.toindex %67 : !felt.type<"babybear"> {product_source = "compute"} + %69 = array.read %arg0[%68] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %70 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %71 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %70[%71] = %69 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@e] = %70 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %73 = arith.subi %72, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %73 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.cmpi eq, %73, %c0 {product_source = "compute"} : index + scf.if %74 { + %75 = pod.read %pod_2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %76 = pod.read %pod_2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_2[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_2[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_2[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Xor5_3::@Xor5_3::@compute(%75, %76, %77, %78, %79) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %80 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_68[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_67[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_67[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_68[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_68[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_68[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_67[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_8[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_7[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_7[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_8[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_8[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_8[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_7[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_22[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_21[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_21[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_22[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_22[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_22[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_21[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %42 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %76 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %45 = cast.toindex %44 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %arg0[%45] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %50 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %76 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %52 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %53 = cast.toindex %52 : !felt.type<"babybear"> {product_source = "compute"} + %54 = array.read %arg0[%53] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %55 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %55[%56] = %54 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@c] = %55 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %57 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %58 = arith.subi %57, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %58 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %59 = arith.cmpi eq, %58, %c0 {product_source = "compute"} : index + scf.if %59 { + %76 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %60 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %61 = cast.toindex %60 : !felt.type<"babybear"> {product_source = "compute"} + %62 = array.read %arg0[%61] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %63 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %64 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %63[%64] = %62 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@d] = %63 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %65 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %66 = arith.subi %65, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %66 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %67 = arith.cmpi eq, %66, %c0 {product_source = "compute"} : index + scf.if %67 { + %76 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + %68 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %69 = cast.toindex %68 : !felt.type<"babybear"> {product_source = "compute"} + %70 = array.read %arg0[%69] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %71 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %72 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %71[%72] = %70 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_46[@e] = %71 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %73 = pod.read %pod_45[@count] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %74 = arith.subi %73, %c1 {product_source = "compute"} : index + pod.write %pod_45[@count] = %74 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %75 = arith.cmpi eq, %74, %c0 {product_source = "compute"} : index + scf.if %75 { + %76 = pod.read %pod_46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %77 = pod.read %pod_46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %78 = pod.read %pod_46[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_46[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %80 = pod.read %pod_46[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %81 = function.call @Xor5_3::@Xor5_3::@compute(%76, %77, %78, %79, %80) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + pod.write %pod_45[@comp] = %81 : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_34[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_33[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_33[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_33[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %37 = array.read %arg0[%36] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %38 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %38[%39] = %37 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@a] = %38 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %41 = arith.subi %40, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %41 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.cmpi eq, %41, %c0 {product_source = "compute"} : index + scf.if %42 { + %52 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @XorArray_2::@XorArray_2::@compute(%52, %53) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %54 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %43 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %44 = struct.readm %43[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %45 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %46 = array.read %44[%45] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %47 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %48 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %47[%48] = %46 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_16[@b] = %47 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = pod.read %pod_15[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.subi %49, %c1 {product_source = "compute"} : index + pod.write %pod_15[@count] = %50 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.cmpi eq, %50, %c0 {product_source = "compute"} : index + scf.if %51 { + %52 = pod.read %pod_16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %53 = pod.read %pod_16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @XorArray_2::@XorArray_2::@compute(%52, %53) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_15[@comp] = %54 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%40] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_66[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_65[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_65[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_65[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_40[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_39[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_39[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_39[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_12[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_11[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_11[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_11[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_28[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_27[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_27[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_27[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_56[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_55[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_55[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_55[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_58[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_57[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_57[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_57[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_20[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_19[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_19[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_19[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_42[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_41[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_41[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_41[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_24[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_23[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_23[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_23[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_60[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_59[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_59[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_59[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_32[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_31[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_31[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_31[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_36[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_35[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_35[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_35[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_44[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_43[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_43[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_43[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_48[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_47[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_47[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_47[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_10[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_9[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_9[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_9[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_18[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_17[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_17[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_17[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_0[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_0[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_26[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_25[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_25[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_25[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_38[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_37[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_37[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_37[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_14[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_13[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_13[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_13[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_50[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_49[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_49[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_49[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %40[%41] = %39 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@a] = %40 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %42 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.subi %42, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %43 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %44 = arith.cmpi eq, %43, %c0 {product_source = "compute"} : index + scf.if %44 { + %54 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + %45 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + %46 = struct.readm %45[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %48 = array.read %46[%47] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %49 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %49[%50] = %48 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_54[@b] = %49 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_53[@count] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.subi %51, %c1 {product_source = "compute"} : index + pod.write %pod_53[@count] = %52 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %53 = arith.cmpi eq, %52, %c0 {product_source = "compute"} : index + scf.if %53 { + %54 = pod.read %pod_54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod_54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %56 = function.call @D_8::@D_8::@compute(%54, %55) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + pod.write %pod_53[@comp] = %56 : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_52[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_51[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_51[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_51[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_62[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_61[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_61[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_61[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_64[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_63[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_63[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_63[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_30[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_29[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_29[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_29[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %37 = cast.toindex %36 : !felt.type<"babybear"> {product_source = "compute"} + %38 = array.read %arg0[%37] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %39 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %39[%40] = %38 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@a] = %39 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %41 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %42 = arith.subi %41, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %42 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %43 = arith.cmpi eq, %42, %c0 {product_source = "compute"} : index + scf.if %43 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + %44 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + %45 = struct.readm %44[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@b] = %48 : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %51 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %54 = pod.read %pod_6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %55 = function.call @XorArray_2::@XorArray_2::@compute(%53, %54) : (!array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %55 : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %35 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %36 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + %37 = struct.readm %36[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "compute"} + %39 = array.read %37[%38] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %40 = felt.add %35, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %41 = cast.toindex %40 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%41] = %39 : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@c4$inputs] = %pod_46 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod_45[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c4] = %0 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r17$inputs] = %pod_48 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_47[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r17] = %1 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8$inputs] = %pod_26 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod_25[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r8] = %2 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5$inputs] = %pod_4 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %3 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r5] = %3 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c3$inputs] = %pod_22 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %4 = pod.read %pod_21[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c3] = %4 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r21$inputs] = %pod_24 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod_23[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r21] = %5 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22$inputs] = %pod_10 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_9[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r22] = %6 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d1$inputs] = %pod_28 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_27[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d1] = %7 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r4$inputs] = %pod_52 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %8 = pod.read %pod_51[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r4] = %8 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23$inputs] = %pod_50 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %9 = pod.read %pod_49[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r23] = %9 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24$inputs] = %pod_6 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %10 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r24] = %10 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7$inputs] = %pod_36 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %11 = pod.read %pod_35[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r7] = %11 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18$inputs] = %pod_14 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %12 = pod.read %pod_13[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r18] = %12 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0$inputs] = %pod_16 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod_15[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r0] = %13 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11$inputs] = %pod_20 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod_19[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r11] = %14 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c0$inputs] = %pod_2 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %15 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c0] = %15 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r19$inputs] = %pod_30 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %16 = pod.read %pod_29[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r19] = %16 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d2$inputs] = %pod_60 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %17 = pod.read %pod_59[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d2] = %17 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r20$inputs] = %pod_12 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %18 = pod.read %pod_11[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r20] = %18 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3$inputs] = %pod_0 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %19 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r3] = %19 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10$inputs] = %pod_66 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %20 = pod.read %pod_65[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r10] = %20 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9$inputs] = %pod_62 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %21 = pod.read %pod_61[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r9] = %21 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14$inputs] = %pod_64 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %22 = pod.read %pod_63[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r14] = %22 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@c1$inputs] = %pod_68 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %23 = pod.read %pod_67[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c1] = %23 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r16$inputs] = %pod_42 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %24 = pod.read %pod_41[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r16] = %24 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12$inputs] = %pod_44 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %25 = pod.read %pod_43[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r12] = %25 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d4$inputs] = %pod_54 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_53[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d4] = %26 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0$inputs] = %pod_34 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod_33[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d0] = %27 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@c2$inputs] = %pod_8 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %28 = pod.read %pod_7[@comp] : <[@count: index, @comp: !struct.type<@Xor5_3::@Xor5_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@c2] = %28 : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "compute"} + struct.writem %self[@r1$inputs] = %pod_56 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_55[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r1] = %29 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@d3$inputs] = %pod_18 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %30 = pod.read %pod_17[@comp] : <[@count: index, @comp: !struct.type<@D_8::@D_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@d3] = %30 : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "compute"} + struct.writem %self[@r6$inputs] = %pod_58 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %31 = pod.read %pod_57[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r6] = %31 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13$inputs] = %pod_38 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %32 = pod.read %pod_37[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r13] = %32 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2$inputs] = %pod_32 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %33 = pod.read %pod_31[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r2] = %33 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15$inputs] = %pod_40 : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %34 = pod.read %pod_39[@comp] : <[@count: index, @comp: !struct.type<@XorArray_2::@XorArray_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@r15] = %34 : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Theta_9::@Theta_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Theta_9::@Theta_9<[]>>, %arg1: !array.type<1600 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1536 = felt.const 1536 : <"babybear"> {product_source = "constrain"} + %felt_const_1216 = felt.const 1216 : <"babybear"> {product_source = "constrain"} + %felt_const_896 = felt.const 896 : <"babybear"> {product_source = "constrain"} + %felt_const_576 = felt.const 576 : <"babybear"> {product_source = "constrain"} + %felt_const_256 = felt.const 256 : <"babybear"> {product_source = "constrain"} + %felt_const_1472 = felt.const 1472 : <"babybear"> {product_source = "constrain"} + %felt_const_1152 = felt.const 1152 : <"babybear"> {product_source = "constrain"} + %felt_const_832 = felt.const 832 : <"babybear"> {product_source = "constrain"} + %felt_const_512 = felt.const 512 : <"babybear"> {product_source = "constrain"} + %felt_const_192 = felt.const 192 : <"babybear"> {product_source = "constrain"} + %felt_const_1408 = felt.const 1408 : <"babybear"> {product_source = "constrain"} + %felt_const_1088 = felt.const 1088 : <"babybear"> {product_source = "constrain"} + %felt_const_768 = felt.const 768 : <"babybear"> {product_source = "constrain"} + %felt_const_448 = felt.const 448 : <"babybear"> {product_source = "constrain"} + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %felt_const_1344 = felt.const 1344 : <"babybear"> {product_source = "constrain"} + %felt_const_1024 = felt.const 1024 : <"babybear"> {product_source = "constrain"} + %felt_const_704 = felt.const 704 : <"babybear"> {product_source = "constrain"} + %felt_const_384 = felt.const 384 : <"babybear"> {product_source = "constrain"} + %felt_const_1280 = felt.const 1280 : <"babybear"> {product_source = "constrain"} + %felt_const_960 = felt.const 960 : <"babybear"> {product_source = "constrain"} + %felt_const_640 = felt.const 640 : <"babybear"> {product_source = "constrain"} + %felt_const_320 = felt.const 320 : <"babybear"> {product_source = "constrain"} + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Theta_9::@Theta_9<[]>>, !array.type<1600 x !felt.type<"babybear">> {product_source = "constrain"} + %1 = struct.readm %arg0[@r3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@r3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@c0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@c0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@r5] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@r5$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@r24] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@r24$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %9 = struct.readm %arg0[@c2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %10 = struct.readm %arg0[@c2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %11 = struct.readm %arg0[@r22] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %12 = struct.readm %arg0[@r22$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %13 = struct.readm %arg0[@r20] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %14 = struct.readm %arg0[@r20$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %15 = struct.readm %arg0[@r18] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %16 = struct.readm %arg0[@r18$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = struct.readm %arg0[@r0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %18 = struct.readm %arg0[@r0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %19 = struct.readm %arg0[@d3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %20 = struct.readm %arg0[@d3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %21 = struct.readm %arg0[@r11] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %22 = struct.readm %arg0[@r11$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %23 = struct.readm %arg0[@c3] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %24 = struct.readm %arg0[@c3$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %25 = struct.readm %arg0[@r21] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %26 = struct.readm %arg0[@r21$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %27 = struct.readm %arg0[@r8] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %28 = struct.readm %arg0[@r8$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %29 = struct.readm %arg0[@d1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %30 = struct.readm %arg0[@d1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %arg0[@r19] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %32 = struct.readm %arg0[@r19$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %33 = struct.readm %arg0[@r2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %34 = struct.readm %arg0[@r2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %35 = struct.readm %arg0[@d0] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %36 = struct.readm %arg0[@d0$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %37 = struct.readm %arg0[@r7] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %38 = struct.readm %arg0[@r7$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %39 = struct.readm %arg0[@r13] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %40 = struct.readm %arg0[@r13$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %41 = struct.readm %arg0[@r15] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %42 = struct.readm %arg0[@r15$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %43 = struct.readm %arg0[@r16] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %44 = struct.readm %arg0[@r16$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %45 = struct.readm %arg0[@r12] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %46 = struct.readm %arg0[@r12$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %47 = struct.readm %arg0[@c4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %48 = struct.readm %arg0[@c4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %49 = struct.readm %arg0[@r17] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %50 = struct.readm %arg0[@r17$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %51 = struct.readm %arg0[@r23] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %52 = struct.readm %arg0[@r23$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %53 = struct.readm %arg0[@r4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %54 = struct.readm %arg0[@r4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %55 = struct.readm %arg0[@d4] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %56 = struct.readm %arg0[@d4$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %57 = struct.readm %arg0[@r1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %58 = struct.readm %arg0[@r1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %59 = struct.readm %arg0[@r6] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %60 = struct.readm %arg0[@r6$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %61 = struct.readm %arg0[@d2] : <@Theta_9::@Theta_9<[]>>, !struct.type<@D_8::@D_8<[]>> {product_source = "constrain"} + %62 = struct.readm %arg0[@d2$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %63 = struct.readm %arg0[@r9] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %64 = struct.readm %arg0[@r9$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %65 = struct.readm %arg0[@r14] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %66 = struct.readm %arg0[@r14$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %67 = struct.readm %arg0[@r10] : <@Theta_9::@Theta_9<[]>>, !struct.type<@XorArray_2::@XorArray_2<[]>> {product_source = "constrain"} + %68 = struct.readm %arg0[@r10$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %69 = struct.readm %arg0[@c1] : <@Theta_9::@Theta_9<[]>>, !struct.type<@Xor5_3::@Xor5_3<[]>> {product_source = "constrain"} + %70 = struct.readm %arg0[@c1$inputs] : <@Theta_9::@Theta_9<[]>>, !pod.type<[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %arg1[%157] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %159[%160] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = cast.toindex %162 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %arg1[%163] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %165[%166] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %168 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = cast.toindex %168 : !felt.type<"babybear"> {product_source = "constrain"} + %170 = array.read %arg1[%169] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %171 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %172 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %173 = array.read %171[%172] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %173, %170 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %174 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = cast.toindex %174 : !felt.type<"babybear"> {product_source = "constrain"} + %176 = array.read %arg1[%175] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %177 = pod.read %4[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %178 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %179 = array.read %177[%178] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %179, %176 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %180 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = cast.toindex %180 : !felt.type<"babybear"> {product_source = "constrain"} + %182 = array.read %arg1[%181] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %183 = pod.read %4[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %184 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %185 = array.read %183[%184] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %185, %182 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %70[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %70[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %70[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %70[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %24[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %24[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %164 = cast.toindex %163 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %arg1[%164] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %169 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %170 = cast.toindex %169 : !felt.type<"babybear"> {product_source = "constrain"} + %171 = array.read %arg1[%170] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %172 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %173 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %174 = array.read %172[%173] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %174, %171 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %175 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %176 = cast.toindex %175 : !felt.type<"babybear"> {product_source = "constrain"} + %177 = array.read %arg1[%176] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %178 = pod.read %48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %179 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %180 = array.read %178[%179] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %180, %177 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %181 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %182 = cast.toindex %181 : !felt.type<"babybear"> {product_source = "constrain"} + %183 = array.read %arg1[%182] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %184 = pod.read %48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %185 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %186 = array.read %184[%185] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %186, %183 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %69[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %47[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %158 = array.read %arg1[%157] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %159 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %159[%160] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %158 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %162 = struct.readm %35[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %163 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %164 = array.read %162[%163] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %165 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %166 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %167 = array.read %165[%166] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %167, %164 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %17[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %161 = array.read %0[%160] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %161, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %35[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %5[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_320 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %35[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %67[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_640 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %35[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %41[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_960 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %35[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %13[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1280 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %9[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %3[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %29[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %57[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %29[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %59[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_384 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %29[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %21[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_704 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %29[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %43[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1024 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %29[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %25[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1344 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %23[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %69[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %33[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %37[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_448 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %45[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_768 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %49[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1088 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %61[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %11[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1408 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %47[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %9[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %19[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %1[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_192 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %19[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %27[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_512 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %19[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %39[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_832 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %19[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %15[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1152 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %19[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %51[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1472 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %3[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %23[@out] : <@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %55[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %53[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_256 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %55[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %63[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_576 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %55[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %65[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_896 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %55[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %31[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1216 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %158 = cast.toindex %157 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %arg1[%158] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %161 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %160[%161] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %163 = struct.readm %55[@out] : <@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %164 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %165 = array.read %163[%164] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %166 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %167 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %168 = array.read %166[%167] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %168, %165 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %156 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %157 = struct.readm %7[@out] : <@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %158 = cast.toindex %156 : !felt.type<"babybear"> {product_source = "constrain"} + %159 = array.read %157[%158] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %160 = felt.add %156, %felt_const_1536 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %161 = cast.toindex %160 : !felt.type<"babybear"> {product_source = "constrain"} + %162 = array.read %0[%161] : <1600 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %162, %159 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %71 = pod.read %48[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %72 = pod.read %48[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %73 = pod.read %48[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %48[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %75 = pod.read %48[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%47, %71, %72, %73, %74, %75) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %76 = pod.read %50[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %77 = pod.read %50[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%49, %76, %77) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %78 = pod.read %28[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %79 = pod.read %28[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%27, %78, %79) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %80 = pod.read %6[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %81 = pod.read %6[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%5, %80, %81) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %82 = pod.read %24[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = pod.read %24[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %84 = pod.read %24[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %85 = pod.read %24[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %86 = pod.read %24[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%23, %82, %83, %84, %85, %86) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %87 = pod.read %26[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %88 = pod.read %26[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%25, %87, %88) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %89 = pod.read %12[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %90 = pod.read %12[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%11, %89, %90) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %91 = pod.read %30[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %92 = pod.read %30[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%29, %91, %92) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %93 = pod.read %54[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %94 = pod.read %54[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%53, %93, %94) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %95 = pod.read %52[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %96 = pod.read %52[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%51, %95, %96) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %97 = pod.read %8[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %98 = pod.read %8[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%7, %97, %98) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %99 = pod.read %38[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %100 = pod.read %38[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%37, %99, %100) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %101 = pod.read %16[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %102 = pod.read %16[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%15, %101, %102) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %103 = pod.read %18[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %104 = pod.read %18[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%17, %103, %104) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %105 = pod.read %22[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %106 = pod.read %22[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%21, %105, %106) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %107 = pod.read %4[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %108 = pod.read %4[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %109 = pod.read %4[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %110 = pod.read %4[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %111 = pod.read %4[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%3, %107, %108, %109, %110, %111) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %112 = pod.read %32[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %113 = pod.read %32[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%31, %112, %113) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %114 = pod.read %62[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %115 = pod.read %62[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%61, %114, %115) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %116 = pod.read %14[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %117 = pod.read %14[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%13, %116, %117) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %118 = pod.read %2[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %119 = pod.read %2[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%1, %118, %119) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %120 = pod.read %68[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %121 = pod.read %68[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%67, %120, %121) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %122 = pod.read %64[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %123 = pod.read %64[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%63, %122, %123) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %124 = pod.read %66[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %125 = pod.read %66[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%65, %124, %125) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %126 = pod.read %70[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %127 = pod.read %70[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %128 = pod.read %70[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %129 = pod.read %70[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %130 = pod.read %70[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%69, %126, %127, %128, %129, %130) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %131 = pod.read %44[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %132 = pod.read %44[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%43, %131, %132) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %133 = pod.read %46[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %134 = pod.read %46[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%45, %133, %134) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %135 = pod.read %56[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %136 = pod.read %56[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%55, %135, %136) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %137 = pod.read %36[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %138 = pod.read %36[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%35, %137, %138) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %139 = pod.read %10[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %140 = pod.read %10[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %141 = pod.read %10[@c] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %142 = pod.read %10[@d] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %143 = pod.read %10[@e] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>, @c: !array.type<64 x !felt.type<"babybear">>, @d: !array.type<64 x !felt.type<"babybear">>, @e: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Xor5_3::@Xor5_3::@constrain(%9, %139, %140, %141, %142, %143) : (!struct.type<@Xor5_3::@Xor5_3<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %144 = pod.read %58[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %145 = pod.read %58[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%57, %144, %145) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %146 = pod.read %20[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %147 = pod.read %20[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @D_8::@D_8::@constrain(%19, %146, %147) : (!struct.type<@D_8::@D_8<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %148 = pod.read %60[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %149 = pod.read %60[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%59, %148, %149) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %150 = pod.read %40[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %151 = pod.read %40[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%39, %150, %151) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %152 = pod.read %34[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %153 = pod.read %34[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%33, %152, %153) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %154 = pod.read %42[@a] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %155 = pod.read %42[@b] : <[@a: !array.type<64 x !felt.type<"babybear">>, @b: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @XorArray_2::@XorArray_2::@constrain(%41, %154, %155) : (!struct.type<@XorArray_2::@XorArray_2<[]>>, !array.type<64 x !felt.type<"babybear">>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/trace_test.llzk b/examples/circom-demo/trace_test.llzk new file mode 100644 index 0000000..c4e551b --- /dev/null +++ b/examples/circom-demo/trace_test.llzk @@ -0,0 +1,272 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@trace_1::@trace_1<[]>>} { + poly.template @matElemSum_0 { + struct.def @matElemSum_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @sum : !array.type<3 x !felt.type<"babybear">> + function.def @product(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %9 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%9) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %9 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %11 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %11 { + %13 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "compute"} + %15 = array.read %nondet[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "compute"} + %17 = array.read %arg0[%c0, %16] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %18 = felt.add %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %19 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%19] = %18 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %12 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %12 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %3 = struct.readm %self[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = struct.readm %self[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %4[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %9 = bool.cmp lt(%arg1, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%9) %arg2 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %9 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %11 { + %13 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %4[%14] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c0, %16] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.add %15, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %4[%19] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %12 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %8 = array.read %4[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @compute(%arg0: !array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %0 = array.read %arg0[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%c0] = %0 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = scf.while (%arg1 = %felt_const_0, %arg2 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.condition(%3) %arg1 : !felt.type<"babybear"> + } do { + ^bb0(%arg1: !felt.type<"babybear">): + %3 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %arg1) -> (!felt.type<"babybear">) { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %5 = bool.cmp gt(%arg3, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.if %5 { + %7 = felt.sub %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "compute"} + %9 = array.read %nondet[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %4 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = felt.add %9, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %13 = cast.toindex %arg3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%13] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + %6 = felt.add %arg3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6 : !felt.type<"babybear"> + } {product_source = "compute"} + scf.yield {product_source = "compute"} %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %2 = array.read %nondet[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %2 : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@sum] = %nondet : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, %arg1: !array.type<1,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@sum] : <@matElemSum_0::@matElemSum_0<[]>>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = array.read %arg1[%c0, %c0] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %3 = array.read %1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %3, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = scf.while (%arg2 = %felt_const_0, %arg3 = %felt_const_0) : (!felt.type<"babybear">, !felt.type<"babybear">) -> !felt.type<"babybear"> { + %6 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.condition(%6) %arg3 : !felt.type<"babybear"> + } do { + ^bb0(%arg2: !felt.type<"babybear">): + %6 = scf.for %arg3 = %c0 to %c3 step %c1 iter_args(%arg4 = %arg2) -> (!felt.type<"babybear">) { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = bool.cmp gt(%arg4, %felt_const_0) : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.if %8 { + %10 = felt.sub %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %1[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %arg1[%c0, %13] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = felt.add %12, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %arg4 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = felt.add %arg4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %9 : !felt.type<"babybear"> + } {product_source = "constrain"} + scf.yield {product_source = "constrain"} %felt_const_1, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %5 = array.read %1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @trace_1 { + struct.def @trace_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @comp : !struct.type<@matElemSum_0::@matElemSum_0<[]>> + struct.member @comp$inputs : !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@trace_1::@trace_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@trace_1::@trace_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@trace_1::@trace_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@comp] : <@trace_1::@trace_1<[]>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@comp$inputs] : <@trace_1::@trace_1<[]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%9, %10] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%c0, %13] = %11 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %12 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %24 = pod.read %pod_0[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %25 = function.call @matElemSum_0::@matElemSum_0::@product(%24) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> + %26 = function.call @matElemSum_0::@matElemSum_0::@compute(%24) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %17 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%18, %19] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %2[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = cast.toindex %17 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %21[%c0, %22] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@trace_1::@trace_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@trace_1::@trace_1<[]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %5 : <@trace_1::@trace_1<[]>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%1, %7) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@trace_1::@trace_1<[]>> + } + function.def @compute(%arg0: !array.type<3,3 x !felt.type<"babybear">>) -> !struct.type<@trace_1::@trace_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@trace_1::@trace_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %8 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %7[%c0, %8] = %6 : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@a] = %7 : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %12 = pod.read %pod_0[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = function.call @matElemSum_0::@matElemSum_0::@compute(%12) : (!array.type<1,3 x !felt.type<"babybear">>) -> !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@trace_1::@trace_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@comp$inputs] = %pod_0 : <@trace_1::@trace_1<[]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + struct.writem %self[@comp] = %2 : <@trace_1::@trace_1<[]>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@trace_1::@trace_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@trace_1::@trace_1<[]>>, %arg1: !array.type<3,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@trace_1::@trace_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@comp] : <@trace_1::@trace_1<[]>>, !struct.type<@matElemSum_0::@matElemSum_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@comp$inputs] : <@trace_1::@trace_1<[]>>, !pod.type<[@a: !array.type<1,3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %arg1[%6, %7] : <3,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = pod.read %2[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %9[%c0, %10] : <1,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %11, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@matElemSum_0::@matElemSum_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@a] : <[@a: !array.type<1,3 x !felt.type<"babybear">>]>, !array.type<1,3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @matElemSum_0::@matElemSum_0::@constrain(%1, %4) : (!struct.type<@matElemSum_0::@matElemSum_0<[]>>, !array.type<1,3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/tranpose_test.llzk b/examples/circom-demo/tranpose_test.llzk new file mode 100644 index 0000000..62c9184 --- /dev/null +++ b/examples/circom-demo/tranpose_test.llzk @@ -0,0 +1,83 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@transpose_0::@transpose_0<[]>>} { + poly.template @transpose_0 { + struct.def @transpose_0 { + struct.member @out : !array.type<3,2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@transpose_0::@transpose_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@transpose_0::@transpose_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@transpose_0::@transpose_0<[]>>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %arg0[%4, %5] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%7, %8] = %6 : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %arg0[%10, %11] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%13, %14] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@transpose_0::@transpose_0<[]>>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return %self : !struct.type<@transpose_0::@transpose_0<[]>> + } + function.def @compute(%arg0: !array.type<2,3 x !felt.type<"babybear">>) -> !struct.type<@transpose_0::@transpose_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %self = struct.new : <@transpose_0::@transpose_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + scf.for %arg1 = %c0 to %c2 step %c1 { + %0 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%2, %3] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %0 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5, %6] = %4 : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@transpose_0::@transpose_0<[]>>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@transpose_0::@transpose_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@transpose_0::@transpose_0<[]>>, %arg1: !array.type<2,3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@transpose_0::@transpose_0<[]>>, !array.type<3,2 x !felt.type<"babybear">> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c2 step %c1 { + %1 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c3 step %c1 { + %2 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%3, %4] : <2,3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "constrain"} + %8 = array.read %0[%6, %7] : <3,2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + } {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_GetValueByIndex.llzk b/examples/circom-demo/utils_GetValueByIndex.llzk new file mode 100644 index 0000000..bc3ffbb --- /dev/null +++ b/examples/circom-demo/utils_GetValueByIndex.llzk @@ -0,0 +1,747 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@getValueByIndex_3::@getValueByIndex_3<[]>>} { + poly.template @MultiMux3_0 { + struct.def @MultiMux3_0 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a210 : !array.type<1 x !felt.type<"babybear">> + struct.member @a21 : !array.type<1 x !felt.type<"babybear">> + struct.member @a20 : !array.type<1 x !felt.type<"babybear">> + struct.member @a2 : !array.type<1 x !felt.type<"babybear">> + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,8 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux3_0::@MultiMux3_0<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_4 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_5 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_6 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_7 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux3_0::@MultiMux3_0<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + %3 = array.read %arg0[%c0, %c7] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %arg0[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = array.read %arg0[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.add %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = felt.mul %17, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %18 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %arg0[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.sub %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.sub %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.mul %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %27 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = array.read %arg0[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %29 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %30 = felt.sub %28, %29 : !felt.type<"babybear">, !felt.type<"babybear"> + %31 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.sub %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.add %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.mul %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_4[%c0] = %36 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %37 = array.read %arg0[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %39 = felt.sub %37, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %39 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %40 = array.read %arg0[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = felt.mul %46, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %47 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = array.read %arg0[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %49 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %50 = felt.sub %48, %49 : !felt.type<"babybear">, !felt.type<"babybear"> + %51 = array.read %arg1[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.mul %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %52 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %53 = array.read %arg0[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %54 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = felt.sub %53, %54 : !felt.type<"babybear">, !felt.type<"babybear"> + %56 = array.read %arg1[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %57 = felt.mul %55, %56 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_5[%c0] = %57 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = array.read %arg0[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_6[%c0] = %58 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %59 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %61 = felt.add %59, %60 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %nondet_4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %63 = felt.add %61, %62 : !felt.type<"babybear">, !felt.type<"babybear"> + %64 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.add %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg1[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.mul %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %69 = array.read %nondet_3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = felt.add %68, %69 : !felt.type<"babybear">, !felt.type<"babybear"> + %71 = array.read %nondet_5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %72 = felt.add %70, %71 : !felt.type<"babybear">, !felt.type<"babybear"> + %73 = array.read %nondet_6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %74 = felt.add %72, %73 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = felt.add %67, %74 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_7[%c0] = %75 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a210] = %nondet : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a21] = %nondet_1 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a20] = %nondet_4 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a2] = %nondet_2 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a10] = %nondet_0 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet_3 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet_5 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_6 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_7 : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, %arg1: !array.type<1,8 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c4 = arith.constant 4 : index + %c5 = arith.constant 5 : index + %c6 = arith.constant 6 : index + %c7 = arith.constant 7 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a210] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a21] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a20] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a2] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@a10] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %6 = struct.readm %arg0[@a1] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %7 = struct.readm %arg0[@a0] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %8 = struct.readm %arg0[@a] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %9 = struct.readm %arg0[@s10] : <@MultiMux3_0::@MultiMux3_0<[]>>, !felt.type<"babybear"> + %10 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = felt.mul %10, %11 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %9, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %13 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%13) + } do { + %13 = array.read %arg1[%c0, %c7] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.sub %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = array.read %arg1[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = felt.sub %15, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = felt.add %17, %18 : !felt.type<"babybear">, !felt.type<"babybear"> + %20 = array.read %arg1[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = felt.sub %19, %20 : !felt.type<"babybear">, !felt.type<"babybear"> + %22 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = felt.add %21, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = felt.add %23, %24 : !felt.type<"babybear">, !felt.type<"babybear"> + %26 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %27 = felt.sub %25, %26 : !felt.type<"babybear">, !felt.type<"babybear"> + %28 = felt.mul %27, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg1[%c0, %c6] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %32 = felt.sub %30, %31 : !felt.type<"babybear">, !felt.type<"babybear"> + %33 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.sub %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.mul %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %39, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + %40 = array.read %arg1[%c0, %c5] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %41 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %42 = felt.sub %40, %41 : !felt.type<"babybear">, !felt.type<"babybear"> + %43 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %44 = felt.sub %42, %43 : !felt.type<"babybear">, !felt.type<"babybear"> + %45 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %46 = felt.add %44, %45 : !felt.type<"babybear">, !felt.type<"babybear"> + %47 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %48 = felt.mul %46, %47 : !felt.type<"babybear">, !felt.type<"babybear"> + %49 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %49, %48 : !felt.type<"babybear">, !felt.type<"babybear"> + %50 = array.read %arg1[%c0, %c4] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %51 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %52 = felt.sub %50, %51 : !felt.type<"babybear">, !felt.type<"babybear"> + %53 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %53, %52 : !felt.type<"babybear">, !felt.type<"babybear"> + %54 = array.read %arg1[%c0, %c3] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %55 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %56 = felt.sub %54, %55 : !felt.type<"babybear">, !felt.type<"babybear"> + %57 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %58 = felt.sub %56, %57 : !felt.type<"babybear">, !felt.type<"babybear"> + %59 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %60 = felt.add %58, %59 : !felt.type<"babybear">, !felt.type<"babybear"> + %61 = felt.mul %60, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + %62 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %62, %61 : !felt.type<"babybear">, !felt.type<"babybear"> + %63 = array.read %arg1[%c0, %c2] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %64 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %65 = felt.sub %63, %64 : !felt.type<"babybear">, !felt.type<"babybear"> + %66 = array.read %arg2[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %67 = felt.mul %65, %66 : !felt.type<"babybear">, !felt.type<"babybear"> + %68 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %68, %67 : !felt.type<"babybear">, !felt.type<"babybear"> + %69 = array.read %arg1[%c0, %c1] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %70 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %71 = felt.sub %69, %70 : !felt.type<"babybear">, !felt.type<"babybear"> + %72 = array.read %arg2[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %73 = felt.mul %71, %72 : !felt.type<"babybear">, !felt.type<"babybear"> + %74 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %74, %73 : !felt.type<"babybear">, !felt.type<"babybear"> + %75 = array.read %arg1[%c0, %c0] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %76 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %76, %75 : !felt.type<"babybear">, !felt.type<"babybear"> + %77 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %78 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %79 = felt.add %77, %78 : !felt.type<"babybear">, !felt.type<"babybear"> + %80 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %81 = felt.add %79, %80 : !felt.type<"babybear">, !felt.type<"babybear"> + %82 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %83 = felt.add %81, %82 : !felt.type<"babybear">, !felt.type<"babybear"> + %84 = array.read %arg2[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %85 = felt.mul %83, %84 : !felt.type<"babybear">, !felt.type<"babybear"> + %86 = array.read %5[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %87 = array.read %6[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %88 = felt.add %86, %87 : !felt.type<"babybear">, !felt.type<"babybear"> + %89 = array.read %7[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %90 = felt.add %88, %89 : !felt.type<"babybear">, !felt.type<"babybear"> + %91 = array.read %8[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %92 = felt.add %90, %91 : !felt.type<"babybear">, !felt.type<"babybear"> + %93 = felt.add %85, %92 : !felt.type<"babybear">, !felt.type<"babybear"> + %94 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %94, %93 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux3_1 { + struct.def @Mux3_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c3 = arith.constant 3 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c11 = arith.constant 11 : index + %self = struct.new : <@Mux3_1::@Mux3_1<[]>> + %pod = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c8 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = function.call @MultiMux3_0::@MultiMux3_0::@compute(%12, %13) : (!array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + } + } + scf.for %arg2 = %c0 to %c3 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %14 = function.call @MultiMux3_0::@MultiMux3_0::@compute(%12, %13) : (!array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + %1 = struct.readm %0[@out] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux3_1::@Mux3_1<[]>>, !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + struct.writem %self[@mux] = %3 : <@Mux3_1::@Mux3_1<[]>>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + function.return %self : !struct.type<@Mux3_1::@Mux3_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux3_1::@Mux3_1<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux3_1::@Mux3_1<[]>>, !struct.type<@MultiMux3_0::@MultiMux3_0<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux3_1::@Mux3_1<[]>>, !pod.type<[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,8 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c3 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<1,8 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @MultiMux3_0::@MultiMux3_0::@constrain(%1, %5, %6) : (!struct.type<@MultiMux3_0::@MultiMux3_0<[]>>, !array.type<1,8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_2 { + struct.def @Num2Bits_2 { + struct.member @out : !array.type<8 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c8 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c8 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getValueByIndex_3 { + struct.def @getValueByIndex_3 { + struct.member @value : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@Mux3_1::@Mux3_1<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> + struct.member @n2b : !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@getValueByIndex_3::@getValueByIndex_3<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c2 = arith.constant 2 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@getValueByIndex_3::@getValueByIndex_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %50 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %51 = function.call @Num2Bits_2::@Num2Bits_2::@product(%50) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> + %52 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%50) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %51 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %50 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "compute"} + %52 = array.read %arg0[%51] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %53 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %54 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "compute"} + array.write %53[%54] = %52 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %53 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %55 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %56 = arith.subi %55, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %56 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %57 = arith.cmpi eq, %56, %c0 {product_source = "compute"} : index + scf.if %57 { + %58 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %59 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %60 = function.call @Mux3_1::@Mux3_1::@compute(%58, %59) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %60 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c0] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %6 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %50 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @Mux3_1::@Mux3_1::@compute(%50, %51) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %52 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %12 = array.read %11[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %13[%c1] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %13 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %50 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @Mux3_1::@Mux3_1::@compute(%50, %51) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %52 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %17 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %19 = array.read %18[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c2] = %19 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %20 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %50 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %51 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @Mux3_1::@Mux3_1::@compute(%50, %51) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %52 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@value] = %25 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %26 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %27 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %28 = struct.readm %self[@value] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %self[@mux] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "constrain"} + %30 = struct.readm %self[@mux$inputs] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %31 = struct.readm %self[@n2b] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %32 = struct.readm %self[@n2b$inputs] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %33 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %33, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %50 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %51 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %52 = array.read %arg0[%51] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = pod.read %30[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %54 = cast.toindex %50 : !felt.type<"babybear"> {product_source = "constrain"} + %55 = array.read %53[%54] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %55, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %34 = struct.readm %31[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = array.read %34[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %36 = pod.read %30[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = array.read %36[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %37, %35 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %38 = struct.readm %31[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = array.read %38[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %40 = pod.read %30[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %41 = array.read %40[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %39 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %42 = struct.readm %31[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %43 = array.read %42[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = pod.read %30[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %45 = array.read %44[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %45, %43 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %46 = struct.readm %29[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %46 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %47 = pod.read %30[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %48 = pod.read %30[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux3_1::@Mux3_1::@constrain(%29, %47, %48) : (!struct.type<@Mux3_1::@Mux3_1<[]>>, !array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %49 = pod.read %32[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%31, %49) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getValueByIndex_3::@getValueByIndex_3<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@getValueByIndex_3::@getValueByIndex_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c2 = arith.constant 2 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c11 = arith.constant {product_source = "compute"} 11 : index + %self = struct.new : <@getValueByIndex_3::@getValueByIndex_3<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c11 } : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + pod.write %pod_2[@in] = %arg1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %0 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %1 = arith.subi %0, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %1 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.cmpi eq, %1, %c0 {product_source = "compute"} : index + scf.if %2 { + %28 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %29 = function.call @Num2Bits_2::@Num2Bits_2::@compute(%28) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %29 : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %28 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %29 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + %30 = array.read %arg0[%29] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %31 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %32 = cast.toindex %28 : !felt.type<"babybear"> {product_source = "compute"} + array.write %31[%32] = %30 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@c] = %31 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %33 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %34 = arith.subi %33, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %34 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.cmpi eq, %34, %c0 {product_source = "compute"} : index + scf.if %35 { + %36 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %37 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @Mux3_1::@Mux3_1::@compute(%36, %37) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %38 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %3 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %5 = array.read %4[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c0] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %6 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %28 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Mux3_1::@Mux3_1::@compute(%28, %29) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %11 = struct.readm %10[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %12 = array.read %11[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %13[%c1] = %12 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %13 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %28 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Mux3_1::@Mux3_1::@compute(%28, %29) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %17 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + %18 = struct.readm %17[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %19 = array.read %18[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + array.write %20[%c2] = %19 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@s] = %20 : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %21 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.subi %21, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %22 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %23 = arith.cmpi eq, %22, %c0 {product_source = "compute"} : index + scf.if %23 { + %28 = pod.read %pod_0[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_0[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Mux3_1::@Mux3_1::@compute(%28, %29) : (!array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %24 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + %25 = struct.readm %24[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@value] = %25 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_0 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Mux3_1::@Mux3_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %26 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %27 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %27 : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getValueByIndex_3::@getValueByIndex_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@getValueByIndex_3::@getValueByIndex_3<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@value] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@mux] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Mux3_1::@Mux3_1<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@mux$inputs] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2b] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !struct.type<@Num2Bits_2::@Num2Bits_2<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2b$inputs] : <@getValueByIndex_3::@getValueByIndex_3<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %22 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %24 = array.read %arg1[%23] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %26 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "constrain"} + %27 = array.read %25[%26] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %27, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %7 = array.read %6[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c0] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = array.read %10[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = array.read %12[%c1] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %13, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = struct.readm %3[@out] : <@Num2Bits_2::@Num2Bits_2<[]>>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %15 = array.read %14[%c2] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %1[@out] : <@Mux3_1::@Mux3_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@c] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = pod.read %2[@s] : <[@c: !array.type<8 x !felt.type<"babybear">>, @s: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux3_1::@Mux3_1::@constrain(%1, %19, %20) : (!struct.type<@Mux3_1::@Mux3_1<[]>>, !array.type<8 x !felt.type<"babybear">>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %21 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_2::@Num2Bits_2::@constrain(%3, %21) : (!struct.type<@Num2Bits_2::@Num2Bits_2<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_getClaimExpiration.llzk b/examples/circom-demo/utils_getClaimExpiration.llzk new file mode 100644 index 0000000..d2e4cdc --- /dev/null +++ b/examples/circom-demo/utils_getClaimExpiration.llzk @@ -0,0 +1,342 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@getClaimExpiration_2::@getClaimExpiration_2<[]>>} { + poly.template @Bits2Num_0 { + struct.def @Bits2Num_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c64 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg5, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %6, %7, %13, %12 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#0 : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + } + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c64 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#0 : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c64 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Num2Bits_1 { + struct.def @Num2Bits_1 { + struct.member @out : !array.type<256 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c256 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getClaimExpiration_2 { + struct.def @getClaimExpiration_2 { + struct.member @expiration : !felt.type<"babybear"> {llzk.pub} + struct.member @expirationBits : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + struct.member @expirationBits$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @v0Bits : !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + struct.member @v0Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimExpiration_2::@getClaimExpiration_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@getClaimExpiration_2::@getClaimExpiration_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %18 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %19 = function.call @Num2Bits_1::@Num2Bits_1::@product(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> + %20 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%18) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = struct.readm %self[@expiration] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = struct.readm %self[@expirationBits] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %6 = struct.readm %self[@expirationBits$inputs] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %self[@v0Bits] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %8 = struct.readm %self[@v0Bits$inputs] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %9 = array.read %arg0[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %18 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %19 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %20 = struct.readm %19[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %21 = felt.add %18, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %20[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %18 : !felt.type<"babybear"> {product_source = "compute"} + array.write %24[%25] = %23 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %24 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %27 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %37 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %38 = function.call @Bits2Num_0::@Bits2Num_0::@product(%37) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + %39 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%37) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %38 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %29 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %30 = struct.readm %7[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = felt.add %29, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %32 = cast.toindex %31 : !felt.type<"babybear"> {product_source = "constrain"} + %33 = array.read %30[%32] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %34 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %35 = cast.toindex %29 : !felt.type<"babybear"> {product_source = "constrain"} + %36 = array.read %34[%35] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %36, %33 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@expiration] = %12 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@v0Bits$inputs] = %pod_2 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %13 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@v0Bits] = %13 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@expirationBits$inputs] = %pod_0 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %14 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + struct.writem %self[@expirationBits] = %14 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %15 = struct.readm %5[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%7, %16) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %17 = pod.read %6[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_0::@Bits2Num_0::@constrain(%5, %17) : (!struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getClaimExpiration_2::@getClaimExpiration_2<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@getClaimExpiration_2::@getClaimExpiration_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c64 = arith.constant {product_source = "compute"} 64 : index + %self = struct.new : <@getClaimExpiration_2::@getClaimExpiration_2<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_1::@Num2Bits_1::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c64 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = felt.add %8, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %10[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %15 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %14[%15] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %14 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "compute"} + %20 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%19) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@expiration] = %5 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@v0Bits$inputs] = %pod_2 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@v0Bits] = %6 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "compute"} + struct.writem %self[@expirationBits$inputs] = %pod_0 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + struct.writem %self[@expirationBits] = %7 : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getClaimExpiration_2::@getClaimExpiration_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimExpiration_2::@getClaimExpiration_2<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %felt_const_64 = felt.const 64 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@expiration] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@expirationBits] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@expirationBits$inputs] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@v0Bits] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !struct.type<@Num2Bits_1::@Num2Bits_1<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@v0Bits$inputs] : <@getClaimExpiration_2::@getClaimExpiration_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = array.read %arg1[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c64 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@Num2Bits_1::@Num2Bits_1<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = felt.add %10, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = cast.toindex %12 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %11[%13] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %10 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %7 = struct.readm %1[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_1::@Num2Bits_1::@constrain(%3, %8) : (!struct.type<@Num2Bits_1::@Num2Bits_1<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_0::@Bits2Num_0::@constrain(%1, %9) : (!struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_getClaimSubjectOtherIden.llzk b/examples/circom-demo/utils_getClaimSubjectOtherIden.llzk new file mode 100644 index 0000000..f6251a2 --- /dev/null +++ b/examples/circom-demo/utils_getClaimSubjectOtherIden.llzk @@ -0,0 +1,1317 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<256 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c256 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_1 { + struct.def @Bits2Num_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @compute(%arg0: !array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, %arg1: !array.type<128 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c128 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getClaimHeader_2 { + struct.def @getClaimHeader_2 { + struct.member @claimType : !felt.type<"babybear"> {llzk.pub} + struct.member @claimFlags : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + struct.member @claimTypeNum : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + struct.member @claimTypeNum$inputs : !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> + struct.member @i0Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @i0Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %19 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = function.call @Num2Bits_0::@Num2Bits_0::@product(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %21 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %21[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = pod.read %pod_0[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %24[%25] = %23 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %24 : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %27 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %29 = pod.read %pod_0[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Bits2Num_1::@Bits2Num_1::@product(%29) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %31 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%29) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %30 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@claimType] = %5 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %22 = felt.add %19, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %21[%23] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%25] = %24 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@claimTypeNum$inputs] = %pod_0 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum] = %6 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits$inputs] = %pod_2 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits] = %7 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@claimFlags] = %nondet : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@claimType] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@claimTypeNum] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@claimTypeNum$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "constrain"} + %12 = struct.readm %self[@i0Bits] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@i0Bits$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %14 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %13[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %12[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %11[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = struct.readm %10[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %12[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = felt.add %19, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %20[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %9[%24] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%10, %17) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<128 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %18 = pod.read %13[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%12, %18) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %self = struct.new : <@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_0[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %13 : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %16 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %18 = pod.read %pod_0[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%18) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %19 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@claimType] = %5 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = felt.add %8, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %10[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@claimTypeNum$inputs] = %pod_0 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum] = %6 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits$inputs] = %pod_2 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits] = %7 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@claimFlags] = %nondet : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@claimType] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@claimTypeNum] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@claimTypeNum$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %arg0[@i0Bits] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@i0Bits$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c128 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %3[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %2[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %4[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = felt.add %11, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %12[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %3[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%2, %9) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<128 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %5[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%4, %10) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_3 { + struct.def @Bits2Num_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Bits2Num_3::@Bits2Num_3<[]>> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %arg2, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %0#0 : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %0, %1#1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @getSubjectLocation_4 { + struct.def @getSubjectLocation_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @subjectBits : !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + struct.member @subjectBits$inputs : !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@getSubjectLocation_4::@getSubjectLocation_4<[]>> + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %12 = function.call @Bits2Num_3::@Bits2Num_3::@compute(%11) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + %1 = struct.readm %0[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@subjectBits$inputs] = %pod_0 : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + struct.writem %self[@subjectBits] = %2 : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + function.return %self : !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@subjectBits] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + %2 = struct.readm %arg0[@subjectBits$inputs] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %8[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @Bits2Num_3::@Bits2Num_3::@constrain(%1, %4) : (!struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @MultiMux2_5 { + struct.def @MultiMux2_5 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux2_5::@MultiMux2_5<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux2_5::@MultiMux2_5<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + %3 = array.read %arg0[%c0, %c3] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %arg0[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %9, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %10 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %15 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.mul %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %20 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %21 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = array.read %nondet_3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.add %22, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %nondet_0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %28 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a10] = %nondet_2 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet_3 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet_1 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_0 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, %arg1: !array.type<1,4 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a10] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a1] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a0] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@s10] : <@MultiMux2_5::@MultiMux2_5<[]>>, !felt.type<"babybear"> + %6 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + %9 = array.read %arg1[%c0, %c3] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = array.read %arg1[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %arg1[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %15, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg1[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg1[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.sub %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.add %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %39, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux2_6 { + struct.def @Mux2_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c6 = arith.constant 6 : index + %self = struct.new : <@Mux2_6::@Mux2_6<[]>> + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %14 = function.call @MultiMux2_5::@MultiMux2_5::@compute(%12, %13) : (!array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + } + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %14 = function.call @MultiMux2_5::@MultiMux2_5::@compute(%12, %13) : (!array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + %1 = struct.readm %0[@out] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux2_6::@Mux2_6<[]>>, !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + struct.writem %self[@mux] = %3 : <@Mux2_6::@Mux2_6<[]>>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + function.return %self : !struct.type<@Mux2_6::@Mux2_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux2_6::@Mux2_6<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux2_6::@Mux2_6<[]>>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux2_6::@Mux2_6<[]>>, !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @MultiMux2_5::@MultiMux2_5::@constrain(%1, %5, %6) : (!struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_7 { + struct.def @Num2Bits_7 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getClaimSubjectOtherIden_8 { + struct.def @getClaimSubjectOtherIden_8 { + struct.member @id : !felt.type<"babybear"> {llzk.pub} + struct.member @header : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + struct.member @header$inputs : !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> + struct.member @subjectLocation : !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> + struct.member @subjectLocation$inputs : !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> + struct.member @mux : !struct.type<@Mux2_6::@Mux2_6<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + struct.member @n2b : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %arg0[%79] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %81 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + array.write %81[%82] = %80 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %81 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %83 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.subi %83, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %84 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.cmpi eq, %84, %c0 {product_source = "compute"} : index + scf.if %85 { + %86 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @getClaimHeader_2::@getClaimHeader_2::@product(%86) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + %88 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%86) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %87 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %80 = struct.readm %79[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %81 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %80[%81] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = pod.read %pod_2[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %84 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + array.write %83[%84] = %82 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@claimFlags] = %83 : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %85 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.subi %85, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %86 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.cmpi eq, %86, %c0 {product_source = "compute"} : index + scf.if %87 { + %88 = pod.read %pod_2[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %89 = function.call @getSubjectLocation_4::@getSubjectLocation_4::@compute(%88) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %89 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %78 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = function.call @Num2Bits_7::@Num2Bits_7::@product(%78) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %80 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%78) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %79 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %6[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c0] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@s] = %8 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %10 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %78 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c1] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@s] = %15 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %78 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %19[%c0] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %19 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %21 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %78 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %23 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %23 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %25 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %78 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %27 = array.read %arg0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %28[%c2] = %27 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %28 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %78 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %32 = array.read %arg0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c3] = %32 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %33 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %35 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %78 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %37 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@id] = %38 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@subjectLocation$inputs] = %pod_2 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@subjectLocation] = %39 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_4 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %40 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_6 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %41 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %41 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_0 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %42 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %42 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %43 = struct.readm %self[@id] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = struct.readm %self[@header] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@header$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@subjectLocation] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@subjectLocation$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %48 = struct.readm %self[@mux] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@mux$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@n2b] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@n2b$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %80 = array.read %arg0[%79] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = pod.read %45[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = array.read %81[%82] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %79 = struct.readm %44[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %79[%80] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = pod.read %47[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %82[%83] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %52 = struct.readm %46[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = pod.read %51[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = struct.readm %50[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = array.read %54[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = pod.read %49[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = array.read %56[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %50[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = array.read %58[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %49[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = array.read %60[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %49[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = array.read %62[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %49[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = array.read %64[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %arg0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %67 = pod.read %49[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = array.read %67[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %66 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = array.read %arg0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %70 = pod.read %49[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = array.read %70[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %69 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = struct.readm %48[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %47[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getSubjectLocation_4::@getSubjectLocation_4::@constrain(%46, %73) : (!struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %74 = pod.read %49[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %75 = pod.read %49[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux2_6::@Mux2_6::@constrain(%48, %74, %75) : (!struct.type<@Mux2_6::@Mux2_6<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %76 = pod.read %51[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%50, %76) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %77 = pod.read %45[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%44, %77) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">> {llzk.pub}) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %c6 = arith.constant {product_source = "compute"} 6 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %46 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %49 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %51 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%51) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %52 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %45 = struct.readm %44[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_2[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@claimFlags] = %48 : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %51 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_2[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @getSubjectLocation_4::@getSubjectLocation_4::@compute(%53) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %54 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %43 = pod.read %pod_6[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%43) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %44 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %6[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c0] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@s] = %8 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %10 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %43 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c1] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@s] = %15 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %43 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %19[%c0] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %19 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %21 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %43 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %23 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %23 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %25 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %43 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %27 = array.read %arg0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %28[%c2] = %27 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %28 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %43 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %32 = array.read %arg0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c3] = %32 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@c] = %33 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %35 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %43 = pod.read %pod_4[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_4[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %37 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@id] = %38 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@subjectLocation$inputs] = %pod_2 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@subjectLocation] = %39 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_4 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %40 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_6 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %41 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %41 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_0 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %42 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %42 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">> {llzk.pub}) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@id] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@header] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@header$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@subjectLocation] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@subjectLocation$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %5 = struct.readm %arg0[@mux] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@mux$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@n2b] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@n2b$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %35 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %arg1[%36] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %38[%39] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %35 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = struct.readm %1[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %36[%37] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = pod.read %4[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %39[%40] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = struct.readm %3[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %7[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = array.read %11[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %7[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg1[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = array.read %27[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %5[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %4[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getSubjectLocation_4::@getSubjectLocation_4::@constrain(%3, %30) : (!struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %31 = pod.read %6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %32 = pod.read %6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux2_6::@Mux2_6::@constrain(%5, %31, %32) : (!struct.type<@Mux2_6::@Mux2_6<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %33 = pod.read %8[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%7, %33) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %34 = pod.read %2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%1, %34) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_getSubjectLocation.llzk b/examples/circom-demo/utils_getSubjectLocation.llzk new file mode 100644 index 0000000..1265981 --- /dev/null +++ b/examples/circom-demo/utils_getSubjectLocation.llzk @@ -0,0 +1,183 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@getSubjectLocation_1::@getSubjectLocation_1<[]>>} { + poly.template @Bits2Num_0 { + struct.def @Bits2Num_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + } + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getSubjectLocation_1 { + struct.def @getSubjectLocation_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @subjectBits : !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + struct.member @subjectBits$inputs : !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_1::@getSubjectLocation_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@getSubjectLocation_1::@getSubjectLocation_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %self[@subjectBits] : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %2 = struct.readm %self[@subjectBits$inputs] : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %10 = array.read %arg0[%9] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %11 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %12 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %11[%12] = %10 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %11 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %13 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %14 = arith.subi %13, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %14 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.cmpi eq, %14, %c0 {product_source = "compute"} : index + scf.if %15 { + %22 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %23 = function.call @Bits2Num_0::@Bits2Num_0::@product(%22) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> + %24 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%22) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %23 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + %16 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %17 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %18 = array.read %arg0[%17] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = cast.toindex %16 : !felt.type<"babybear"> {product_source = "constrain"} + %21 = array.read %19[%20] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "fused"} + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %4 = struct.readm %3[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %4 : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@subjectBits$inputs] = %pod_0 : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %5 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + struct.writem %self[@subjectBits] = %5 : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %6 = struct.readm %1[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_0::@Bits2Num_0::@constrain(%1, %7) : (!struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getSubjectLocation_1::@getSubjectLocation_1<[]>> + } + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_1::@getSubjectLocation_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %self = struct.new : <@getSubjectLocation_1::@getSubjectLocation_1<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + %5 = array.read %arg0[%4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %7 = cast.toindex %3 : !felt.type<"babybear"> {product_source = "compute"} + array.write %6[%7] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %6 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "compute"} + %12 = function.call @Bits2Num_0::@Bits2Num_0::@compute(%11) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %1 : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@subjectBits$inputs] = %pod_0 : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "compute"} + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + struct.writem %self[@subjectBits] = %2 : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getSubjectLocation_1::@getSubjectLocation_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@getSubjectLocation_1::@getSubjectLocation_1<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@subjectBits] : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !struct.type<@Bits2Num_0::@Bits2Num_0<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@subjectBits$inputs] : <@getSubjectLocation_1::@getSubjectLocation_1<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %6 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %7 = array.read %arg1[%6] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = cast.toindex %5 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %8[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %3 = struct.readm %1[@out] : <@Bits2Num_0::@Bits2Num_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_0::@Bits2Num_0::@constrain(%1, %4) : (!struct.type<@Bits2Num_0::@Bits2Num_0<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_isExpirable.llzk b/examples/circom-demo/utils_isExpirable.llzk new file mode 100644 index 0000000..cb1d92b --- /dev/null +++ b/examples/circom-demo/utils_isExpirable.llzk @@ -0,0 +1,32 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@isExpirable_0::@isExpirable_0<[]>>} { + poly.template @isExpirable_0 { + struct.def @isExpirable_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@isExpirable_0::@isExpirable_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %self = struct.new : <@isExpirable_0::@isExpirable_0<[]>> {product_source = "compute"} + %0 = array.read %arg0[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %0 : <@isExpirable_0::@isExpirable_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@isExpirable_0::@isExpirable_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %arg0[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@isExpirable_0::@isExpirable_0<[]>> + } + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@isExpirable_0::@isExpirable_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %self = struct.new : <@isExpirable_0::@isExpirable_0<[]>> {product_source = "compute"} + %0 = array.read %arg0[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %0 : <@isExpirable_0::@isExpirable_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@isExpirable_0::@isExpirable_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@isExpirable_0::@isExpirable_0<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %0 = struct.readm %arg0[@out] : <@isExpirable_0::@isExpirable_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = array.read %arg1[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_isUpdatable.llzk b/examples/circom-demo/utils_isUpdatable.llzk new file mode 100644 index 0000000..08fedd6 --- /dev/null +++ b/examples/circom-demo/utils_isUpdatable.llzk @@ -0,0 +1,32 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@isUpdatable_0::@isUpdatable_0<[]>>} { + poly.template @isUpdatable_0 { + struct.def @isUpdatable_0 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@isUpdatable_0::@isUpdatable_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c4 = arith.constant 4 : index + %self = struct.new : <@isUpdatable_0::@isUpdatable_0<[]>> {product_source = "compute"} + %0 = array.read %arg0[%c4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %0 : <@isUpdatable_0::@isUpdatable_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %1 = struct.readm %self[@out] : <@isUpdatable_0::@isUpdatable_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %2 = array.read %arg0[%c4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@isUpdatable_0::@isUpdatable_0<[]>> + } + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@isUpdatable_0::@isUpdatable_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c4 = arith.constant 4 : index + %self = struct.new : <@isUpdatable_0::@isUpdatable_0<[]>> {product_source = "compute"} + %0 = array.read %arg0[%c4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %0 : <@isUpdatable_0::@isUpdatable_0<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@isUpdatable_0::@isUpdatable_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@isUpdatable_0::@isUpdatable_0<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c4 = arith.constant 4 : index + %0 = struct.readm %arg0[@out] : <@isUpdatable_0::@isUpdatable_0<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = array.read %arg1[%c4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_verifyCredentialSubject.llzk b/examples/circom-demo/utils_verifyCredentialSubject.llzk new file mode 100644 index 0000000..ed72fe3 --- /dev/null +++ b/examples/circom-demo/utils_verifyCredentialSubject.llzk @@ -0,0 +1,1495 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<256 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c256 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_1 { + struct.def @Bits2Num_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @compute(%arg0: !array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, %arg1: !array.type<128 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c128 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getClaimHeader_2 { + struct.def @getClaimHeader_2 { + struct.member @claimType : !felt.type<"babybear"> {llzk.pub} + struct.member @claimFlags : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + struct.member @i0Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @i0Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @claimTypeNum : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + struct.member @claimTypeNum$inputs : !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %19 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = function.call @Num2Bits_0::@Num2Bits_0::@product(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %21 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %21[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %24[%25] = %23 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %24 : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %27 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %29 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Bits2Num_1::@Bits2Num_1::@product(%29) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %31 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%29) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %30 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@claimType] = %5 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %22 = felt.add %19, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %21[%23] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%25] = %24 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@claimTypeNum$inputs] = %pod_2 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum] = %6 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits$inputs] = %pod_0 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits] = %7 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@claimFlags] = %nondet : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@claimType] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@i0Bits] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@i0Bits$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = struct.readm %self[@claimTypeNum] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@claimTypeNum$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %10[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %13[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = struct.readm %12[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %10[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = felt.add %19, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %20[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %9[%24] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %17 = pod.read %13[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%12, %17) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<128 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %18 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%10, %18) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %13 : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %16 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %18 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%18) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@claimType] = %5 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = felt.add %8, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %10[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@claimTypeNum$inputs] = %pod_2 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %6 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum] = %6 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits$inputs] = %pod_0 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits] = %7 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@claimFlags] = %nondet : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@claimType] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@i0Bits] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@i0Bits$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %4 = struct.readm %arg0[@claimTypeNum] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@claimTypeNum$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c128 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %5[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = felt.add %11, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %12[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %5[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%4, %9) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<128 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %10 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %10) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_3 { + struct.def @Bits2Num_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Bits2Num_3::@Bits2Num_3<[]>> + %0:2 = scf.for %arg1 = %c0 to %c3 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %0#1 : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, %arg1: !array.type<3 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + %1:2 = scf.for %arg2 = %c0 to %c3 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %0, %1#1 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @getSubjectLocation_4 { + struct.def @getSubjectLocation_4 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @subjectBits : !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + struct.member @subjectBits$inputs : !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@getSubjectLocation_4::@getSubjectLocation_4<[]>> + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg1 = %c0 to %c3 step %c1 { + %3 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %4 = cast.toindex %3 : !felt.type<"babybear"> + %5 = array.read %arg0[%4] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %7 = cast.toindex %3 : !felt.type<"babybear"> + array.write %6[%7] = %5 : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %6 : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, index + %9 = arith.subi %8, %c1 : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.cmpi eq, %9, %c0 : index + scf.if %10 { + %11 = pod.read %pod_0[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %12 = function.call @Bits2Num_3::@Bits2Num_3::@compute(%11) : (!array.type<3 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + pod.write %pod[@comp] = %12 : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + %1 = struct.readm %0[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@out] = %1 : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@subjectBits$inputs] = %pod_0 : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + %2 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + struct.writem %self[@subjectBits] = %2 : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + function.return %self : !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, %arg1: !array.type<32 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@subjectBits] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + %2 = struct.readm %arg0[@subjectBits$inputs] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !pod.type<[@in: !array.type<3 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c3 step %c1 { + %5 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %6 = cast.toindex %5 : !felt.type<"babybear"> + %7 = array.read %arg1[%6] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + %9 = cast.toindex %5 : !felt.type<"babybear"> + %10 = array.read %8[%9] : <3 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %10, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + constrain.eq %0, %3 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = pod.read %2[@in] : <[@in: !array.type<3 x !felt.type<"babybear">>]>, !array.type<3 x !felt.type<"babybear">> + function.call @Bits2Num_3::@Bits2Num_3::@constrain(%1, %4) : (!struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, !array.type<3 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @MultiMux2_5 { + struct.def @MultiMux2_5 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + struct.member @a10 : !array.type<1 x !felt.type<"babybear">> + struct.member @a1 : !array.type<1 x !felt.type<"babybear">> + struct.member @a0 : !array.type<1 x !felt.type<"babybear">> + struct.member @a : !array.type<1 x !felt.type<"babybear">> + struct.member @s10 : !felt.type<"babybear"> + function.def @compute(%arg0: !array.type<1,4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux2_5::@MultiMux2_5<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_0 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_1 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_2 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %nondet_3 = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + %0 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.mul %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + struct.writem %self[@s10] = %2 : <@MultiMux2_5::@MultiMux2_5<[]>>, !felt.type<"babybear"> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %3 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%3) + } do { + %3 = array.read %arg0[%c0, %c3] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.sub %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = array.read %arg0[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = felt.sub %5, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %9 = felt.add %7, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + %10 = felt.mul %9, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_1[%c0] = %10 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = array.read %arg0[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %12 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.mul %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %15 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %16 = array.read %arg0[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %17 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> + %19 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.mul %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_3[%c0] = %20 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %21 = array.read %arg0[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + array.write %nondet_2[%c0] = %21 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = array.read %nondet_1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %23 = array.read %nondet[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %24 = felt.add %22, %23 : !felt.type<"babybear">, !felt.type<"babybear"> + %25 = array.read %nondet_3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.add %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %nondet_2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.add %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet_0[%c0] = %28 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@a10] = %nondet_1 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a1] = %nondet : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a0] = %nondet_3 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@a] = %nondet_2 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + struct.writem %self[@out] = %nondet_0 : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, %arg1: !array.type<1,4 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c3 = arith.constant 3 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %1 = struct.readm %arg0[@a10] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = struct.readm %arg0[@a1] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %3 = struct.readm %arg0[@a0] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = struct.readm %arg0[@a] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = struct.readm %arg0[@s10] : <@MultiMux2_5::@MultiMux2_5<[]>>, !felt.type<"babybear"> + %6 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %8 = felt.mul %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + constrain.eq %5, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %9 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%9) + } do { + %9 = array.read %arg1[%c0, %c3] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = array.read %arg1[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = felt.sub %9, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = array.read %arg1[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %13 = felt.sub %11, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + %14 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = felt.add %13, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + %16 = felt.mul %15, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %17 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %16 : !felt.type<"babybear">, !felt.type<"babybear"> + %18 = array.read %arg1[%c0, %c2] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %19 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %20 = felt.sub %18, %19 : !felt.type<"babybear">, !felt.type<"babybear"> + %21 = array.read %arg2[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %22 = felt.mul %20, %21 : !felt.type<"babybear">, !felt.type<"babybear"> + %23 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %23, %22 : !felt.type<"babybear">, !felt.type<"babybear"> + %24 = array.read %arg1[%c0, %c1] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %25 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %26 = felt.sub %24, %25 : !felt.type<"babybear">, !felt.type<"babybear"> + %27 = array.read %arg2[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %28 = felt.mul %26, %27 : !felt.type<"babybear">, !felt.type<"babybear"> + %29 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %29, %28 : !felt.type<"babybear">, !felt.type<"babybear"> + %30 = array.read %arg1[%c0, %c0] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %31 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %31, %30 : !felt.type<"babybear">, !felt.type<"babybear"> + %32 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %33 = array.read %2[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %34 = felt.add %32, %33 : !felt.type<"babybear">, !felt.type<"babybear"> + %35 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %36 = felt.add %34, %35 : !felt.type<"babybear">, !felt.type<"babybear"> + %37 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + %38 = felt.add %36, %37 : !felt.type<"babybear">, !felt.type<"babybear"> + %39 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %39, %38 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux2_6 { + struct.def @Mux2_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + function.def @compute(%arg0: !array.type<4 x !felt.type<"babybear">>, %arg1: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c6 = arith.constant 6 : index + %self = struct.new : <@Mux2_6::@Mux2_6<[]>> + %pod = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + scf.for %arg2 = %c0 to %c4 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg0[%5] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%c0, %8] = %6 : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %7 : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %14 = function.call @MultiMux2_5::@MultiMux2_5::@compute(%12, %13) : (!array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + } + } + scf.for %arg2 = %c0 to %c2 step %c1 { + %4 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %5 = cast.toindex %4 : !felt.type<"babybear"> + %6 = array.read %arg1[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %7 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %8 = cast.toindex %4 : !felt.type<"babybear"> + array.write %7[%8] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@s] = %7 : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %9 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %10 = arith.subi %9, %c1 : index + pod.write %pod[@count] = %10 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, index + %11 = arith.cmpi eq, %10, %c0 : index + scf.if %11 { + %12 = pod.read %pod_0[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %13 = pod.read %pod_0[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %14 = function.call @MultiMux2_5::@MultiMux2_5::@compute(%12, %13) : (!array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + pod.write %pod[@comp] = %14 : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + } + } + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + %1 = struct.readm %0[@out] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %2 = array.read %1[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %2 : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux2_6::@Mux2_6<[]>>, !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + struct.writem %self[@mux] = %3 : <@Mux2_6::@Mux2_6<[]>>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + function.return %self : !struct.type<@Mux2_6::@Mux2_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux2_6::@Mux2_6<[]>>, %arg1: !array.type<4 x !felt.type<"babybear">>, %arg2: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c2 = arith.constant 2 : index + %c1 = arith.constant 1 : index + %c4 = arith.constant 4 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux2_6::@Mux2_6<[]>>, !struct.type<@MultiMux2_5::@MultiMux2_5<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux2_6::@Mux2_6<[]>>, !pod.type<[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + scf.for %arg3 = %c0 to %c4 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg1[%8] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%c0, %11] : <1,4 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + scf.for %arg3 = %c0 to %c2 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg2[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %2[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + %12 = array.read %10[%11] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = struct.readm %1[@out] : <@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1 x !felt.type<"babybear">> + %4 = array.read %3[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = pod.read %2[@c] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<1,4 x !felt.type<"babybear">> + %6 = pod.read %2[@s] : <[@c: !array.type<1,4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> + function.call @MultiMux2_5::@MultiMux2_5::@constrain(%1, %5, %6) : (!struct.type<@MultiMux2_5::@MultiMux2_5<[]>>, !array.type<1,4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_7 { + struct.def @Num2Bits_7 { + struct.member @out : !array.type<2 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg4, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %10, %9, %21, %22 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#2, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c2 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg3, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %9, %8 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c2 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg3, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %12, %13 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#0, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getClaimSubjectOtherIden_8 { + struct.def @getClaimSubjectOtherIden_8 { + struct.member @id : !felt.type<"babybear"> {llzk.pub} + struct.member @header : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + struct.member @header$inputs : !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> + struct.member @n2b : !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @subjectLocation : !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> + struct.member @subjectLocation$inputs : !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> + struct.member @mux : !struct.type<@Mux2_6::@Mux2_6<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c6 = arith.constant {product_source = "compute"} 6 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %80 = array.read %arg0[%79] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %81 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %82 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + array.write %81[%82] = %80 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %81 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %83 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %84 = arith.subi %83, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %84 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %85 = arith.cmpi eq, %84, %c0 {product_source = "compute"} : index + scf.if %85 { + %86 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %87 = function.call @getClaimHeader_2::@getClaimHeader_2::@product(%86) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + %88 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%86) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %87 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %79 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %80 = struct.readm %79[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %81 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + %82 = array.read %80[%81] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %83 = pod.read %pod_4[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %84 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "compute"} + array.write %83[%84] = %82 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@claimFlags] = %83 : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %85 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %86 = arith.subi %85, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %86 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %87 = arith.cmpi eq, %86, %c0 {product_source = "compute"} : index + scf.if %87 { + %88 = pod.read %pod_4[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %89 = function.call @getSubjectLocation_4::@getSubjectLocation_4::@compute(%88) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %89 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %78 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %79 = function.call @Num2Bits_7::@Num2Bits_7::@product(%78) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> + %80 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%78) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %79 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %6[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c0] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@s] = %8 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %10 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %78 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c1] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@s] = %15 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %78 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %19[%c0] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %19 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %21 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %78 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %23 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %23 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %25 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %78 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %27 = array.read %arg0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %28[%c2] = %27 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %28 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %78 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %32 = array.read %arg0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c3] = %32 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %33 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %35 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %78 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %79 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %80 = function.call @Mux2_6::@Mux2_6::@compute(%78, %79) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %80 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %37 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@id] = %38 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_6 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %39 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@subjectLocation$inputs] = %pod_4 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@subjectLocation] = %40 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_0 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %41 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %41 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %42 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %42 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %43 = struct.readm %self[@id] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %44 = struct.readm %self[@header] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %45 = struct.readm %self[@header$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %46 = struct.readm %self[@n2b] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "constrain"} + %47 = struct.readm %self[@n2b$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %48 = struct.readm %self[@subjectLocation] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "constrain"} + %49 = struct.readm %self[@subjectLocation$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %50 = struct.readm %self[@mux] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "constrain"} + %51 = struct.readm %self[@mux$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %79 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %80 = array.read %arg0[%79] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %81 = pod.read %45[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %82 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %83 = array.read %81[%82] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %83, %80 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %78 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %79 = struct.readm %44[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %80 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %81 = array.read %79[%80] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %82 = pod.read %49[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %83 = cast.toindex %78 : !felt.type<"babybear"> {product_source = "constrain"} + %84 = array.read %82[%83] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %84, %81 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %52 = struct.readm %48[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %53 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %53, %52 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %54 = struct.readm %46[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = array.read %54[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %56 = pod.read %51[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %57 = array.read %56[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %57, %55 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %58 = struct.readm %46[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %59 = array.read %58[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %51[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = array.read %60[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %61, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %62 = pod.read %51[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %63 = array.read %62[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %63, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %64 = pod.read %51[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %65 = array.read %64[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %65, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %66 = array.read %arg0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %67 = pod.read %51[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %68 = array.read %67[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %68, %66 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %69 = array.read %arg0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %70 = pod.read %51[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %71 = array.read %70[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %71, %69 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %72 = struct.readm %50[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %43, %72 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %73 = pod.read %51[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %74 = pod.read %51[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux2_6::@Mux2_6::@constrain(%50, %73, %74) : (!struct.type<@Mux2_6::@Mux2_6<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %75 = pod.read %49[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getSubjectLocation_4::@getSubjectLocation_4::@constrain(%48, %75) : (!struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %76 = pod.read %45[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%44, %76) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %77 = pod.read %47[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%46, %77) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %c6 = arith.constant {product_source = "compute"} 6 : index + %c32 = arith.constant {product_source = "compute"} 32 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c32 } : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c6 } : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg1 = %c0 to %c8 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %45 = array.read %arg0[%44] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %46 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %47 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %46[%47] = %45 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %46 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %48 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %49 = arith.subi %48, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %49 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %50 = arith.cmpi eq, %49, %c0 {product_source = "compute"} : index + scf.if %50 { + %51 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %52 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%51) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %52 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %43 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %44 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %45 = struct.readm %44[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %46 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + %47 = array.read %45[%46] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %48 = pod.read %pod_4[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %49 = cast.toindex %43 : !felt.type<"babybear"> {product_source = "compute"} + array.write %48[%49] = %47 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@claimFlags] = %48 : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %50 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %51 = arith.subi %50, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %51 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %52 = arith.cmpi eq, %51, %c0 {product_source = "compute"} : index + scf.if %52 { + %53 = pod.read %pod_4[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %54 = function.call @getSubjectLocation_4::@getSubjectLocation_4::@compute(%53) : (!array.type<32 x !felt.type<"babybear">>) -> !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %54 : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + %1 = struct.readm %0[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %1 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %2 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %3 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %43 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %44 = function.call @Num2Bits_7::@Num2Bits_7::@compute(%43) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %44 : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %6 = struct.readm %5[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = array.read %6[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %8[%c0] = %7 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@s] = %8 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %9 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.subi %9, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %10 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %11 = arith.cmpi eq, %10, %c0 {product_source = "compute"} : index + scf.if %11 { + %43 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %12 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + %13 = struct.readm %12[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %14 = array.read %13[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %15 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %15[%c1] = %14 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@s] = %15 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %16 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.subi %16, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %17 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.cmpi eq, %17, %c0 {product_source = "compute"} : index + scf.if %18 { + %43 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %19 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %19[%c0] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %19 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %20 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %21 = arith.subi %20, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %21 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %22 = arith.cmpi eq, %21, %c0 {product_source = "compute"} : index + scf.if %22 { + %43 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %23 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %23[%c1] = %felt_const_0 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %23 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %24 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.subi %24, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %25 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %26 = arith.cmpi eq, %25, %c0 {product_source = "compute"} : index + scf.if %26 { + %43 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %27 = array.read %arg0[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %28 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %28[%c2] = %27 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %28 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %29 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %30 = arith.subi %29, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %30 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %31 = arith.cmpi eq, %30, %c0 {product_source = "compute"} : index + scf.if %31 { + %43 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %32 = array.read %arg0[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + array.write %33[%c3] = %32 : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@c] = %33 : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %34 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %35 = arith.subi %34, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %35 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.cmpi eq, %35, %c0 {product_source = "compute"} : index + scf.if %36 { + %43 = pod.read %pod_6[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "compute"} + %44 = pod.read %pod_6[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %45 = function.call @Mux2_6::@Mux2_6::@compute(%43, %44) : (!array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %45 : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %37 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + %38 = struct.readm %37[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@id] = %38 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@mux$inputs] = %pod_6 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %39 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@Mux2_6::@Mux2_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@mux] = %39 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "compute"} + struct.writem %self[@subjectLocation$inputs] = %pod_4 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "compute"} + %40 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@subjectLocation] = %40 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_0 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %41 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %41 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_2 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %42 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %42 : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c5 = arith.constant 5 : index + %c2 = arith.constant 2 : index + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@id] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@header] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@header$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = struct.readm %arg0[@n2b] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Num2Bits_7::@Num2Bits_7<[]>> {product_source = "constrain"} + %4 = struct.readm %arg0[@n2b$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %5 = struct.readm %arg0[@subjectLocation] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>> {product_source = "constrain"} + %6 = struct.readm %arg0[@subjectLocation$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@claimFlags: !array.type<32 x !felt.type<"babybear">>]> {product_source = "constrain"} + %7 = struct.readm %arg0[@mux] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !struct.type<@Mux2_6::@Mux2_6<[]>> {product_source = "constrain"} + %8 = struct.readm %arg0[@mux$inputs] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !pod.type<[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %35 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %37 = array.read %arg1[%36] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %38 = pod.read %2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %40 = array.read %38[%39] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %40, %37 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %35 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %36 = struct.readm %1[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %37 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %38 = array.read %36[%37] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %39 = pod.read %6[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %40 = cast.toindex %35 : !felt.type<"babybear"> {product_source = "constrain"} + %41 = array.read %39[%40] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %41, %38 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = struct.readm %5[@out] : <@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %10, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = struct.readm %3[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = array.read %11[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %8[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %12 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %3[@out] : <@Num2Bits_7::@Num2Bits_7<[]>>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = array.read %15[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %17 = pod.read %8[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %18 = array.read %17[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %18, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %8[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %20 = array.read %19[%c0] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = pod.read %8[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %22 = array.read %21[%c1] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %22, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %arg1[%c1] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = pod.read %8[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = array.read %24[%c2] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %26 = array.read %arg1[%c5] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %27 = pod.read %8[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %28 = array.read %27[%c3] : <4 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %28, %26 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %29 = struct.readm %7[@out] : <@Mux2_6::@Mux2_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %8[@c] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<4 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = pod.read %8[@s] : <[@c: !array.type<4 x !felt.type<"babybear">>, @s: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Mux2_6::@Mux2_6::@constrain(%7, %30, %31) : (!struct.type<@Mux2_6::@Mux2_6<[]>>, !array.type<4 x !felt.type<"babybear">>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %32 = pod.read %6[@claimFlags] : <[@claimFlags: !array.type<32 x !felt.type<"babybear">>]>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getSubjectLocation_4::@getSubjectLocation_4::@constrain(%5, %32) : (!struct.type<@getSubjectLocation_4::@getSubjectLocation_4<[]>>, !array.type<32 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %33 = pod.read %2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%1, %33) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %34 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_7::@Num2Bits_7::@constrain(%3, %34) : (!struct.type<@Num2Bits_7::@Num2Bits_7<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @verifyCredentialSubject_9 { + struct.def @verifyCredentialSubject_9 { + struct.member @subjectOtherIden : !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> + struct.member @subjectOtherIden$inputs : !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> + struct.member @header : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + struct.member @header$inputs : !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@claim] = %12 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %15 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %18 = function.call @getClaimHeader_2::@getClaimHeader_2::@product(%17) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + %19 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%17) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %18 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + %11 = array.read %arg0[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %12 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "compute"} + array.write %12[%13] = %11 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %12 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %14 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %15 = arith.subi %14, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %15 : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.cmpi eq, %15, %c0 {product_source = "compute"} : index + scf.if %16 { + %17 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %18 = function.call @getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8::@product(%17) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> + %19 = function.call @getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8::@compute(%17) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %18 : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@subjectOtherIden$inputs] = %pod_0 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + struct.writem %self[@subjectOtherIden] = %0 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_2 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %1 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %2 = struct.readm %self[@subjectOtherIden] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "constrain"} + %3 = struct.readm %self[@subjectOtherIden$inputs] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %4 = struct.readm %self[@header] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %5 = struct.readm %self[@header$inputs] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %5[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %9 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %10 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %11 = array.read %arg0[%10] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %12 = pod.read %3[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %9 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %6 = struct.readm %2[@id] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %6, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %3[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8::@constrain(%2, %7) : (!struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %8 = pod.read %5[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%4, %8) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@claim] = %5 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %8 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %10 = pod.read %pod_2[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %11 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%10) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %11 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %5[%6] = %4 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %5 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %8 : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %10 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %11 = function.call @getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8::@compute(%10) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %11 : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@subjectOtherIden$inputs] = %pod_0 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + struct.writem %self[@subjectOtherIden] = %0 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_2 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %1 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %1 : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@subjectOtherIden] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>> {product_source = "constrain"} + %1 = struct.readm %arg0[@subjectOtherIden$inputs] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %2 = struct.readm %arg0[@header] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@header$inputs] : <@verifyCredentialSubject_9::@verifyCredentialSubject_9<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %3[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %7 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %8 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %9 = array.read %arg1[%8] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = pod.read %1[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %11 = cast.toindex %7 : !felt.type<"babybear"> {product_source = "constrain"} + %12 = array.read %10[%11] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %4 = struct.readm %0[@id] : <@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %4, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = pod.read %1[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8::@constrain(%0, %5) : (!struct.type<@getClaimSubjectOtherIden_8::@getClaimSubjectOtherIden_8<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %6 = pod.read %3[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%2, %6) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/utils_verifyExpirationTime.llzk b/examples/circom-demo/utils_verifyExpirationTime.llzk new file mode 100644 index 0000000..f106172 --- /dev/null +++ b/examples/circom-demo/utils_verifyExpirationTime.llzk @@ -0,0 +1,1401 @@ +module attributes {llzk.lang, llzk.main = !struct.type<@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>} { + poly.template @Num2Bits_0 { + struct.def @Num2Bits_0 { + struct.member @out : !array.type<256 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c256 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c256 = arith.constant 256 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c256 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_1 { + struct.def @Bits2Num_1 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @product(%arg0: !array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0, %arg4 = %felt_const_0, %arg5 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %4 = array.read %arg0[%3] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %arg0[%9] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg5, %arg5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %7, %6, %12, %13 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %1#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + constrain.eq %0, %1#2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @compute(%arg0: !array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c128 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %3 = array.read %arg0[%2] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %0#1 : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, %arg1: !array.type<128 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c128 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %arg1[%3] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @getClaimHeader_2 { + struct.def @getClaimHeader_2 { + struct.member @claimType : !felt.type<"babybear"> {llzk.pub} + struct.member @claimFlags : !array.type<32 x !felt.type<"babybear">> {llzk.pub} + struct.member @i0Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @i0Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + struct.member @claimTypeNum : !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + struct.member @claimTypeNum$inputs : !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c32 = arith.constant 32 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %19 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %20 = function.call @Num2Bits_0::@Num2Bits_0::@product(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %21 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%19) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %22 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + %23 = array.read %21[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %24 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %24[%25] = %23 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %24 : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %26 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %27 = arith.subi %26, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %27 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %28 = arith.cmpi eq, %27, %c0 {product_source = "compute"} : index + scf.if %28 { + %29 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %30 = function.call @Bits2Num_1::@Bits2Num_1::@product(%29) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> + %31 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%29) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %30 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@claimType] = %5 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %20 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %21 = struct.readm %20[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %22 = felt.add %19, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %23 = cast.toindex %22 : !felt.type<"babybear"> {product_source = "compute"} + %24 = array.read %21[%23] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %25 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%25] = %24 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@i0Bits$inputs] = %pod_0 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits] = %6 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum$inputs] = %pod_2 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum] = %7 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimFlags] = %nondet : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %8 = struct.readm %self[@claimType] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %9 = struct.readm %self[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %10 = struct.readm %self[@i0Bits] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %11 = struct.readm %self[@i0Bits$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %12 = struct.readm %self[@claimTypeNum] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %13 = struct.readm %self[@claimTypeNum$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "constrain"} + %14 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %15, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %10[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %22 = array.read %20[%21] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %13[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %23[%24] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %16 = struct.readm %12[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %19 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %10[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = felt.add %19, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = cast.toindex %21 : !felt.type<"babybear"> {product_source = "constrain"} + %23 = array.read %20[%22] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %24 = cast.toindex %19 : !felt.type<"babybear"> {product_source = "constrain"} + %25 = array.read %9[%24] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %25, %23 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %17 = pod.read %11[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%10, %17) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %18 = pod.read %13[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%12, %18) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<128 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c32 = arith.constant 32 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c128 = arith.constant {product_source = "compute"} 128 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c128 } : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %8 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg1 = %c0 to %c128 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + %12 = array.read %10[%11] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %13 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %13[%14] = %12 : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@in] = %13 : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %15 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %16 = arith.subi %15, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %16 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %17 = arith.cmpi eq, %16, %c0 {product_source = "compute"} : index + scf.if %17 { + %18 = pod.read %pod_2[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "compute"} + %19 = function.call @Bits2Num_1::@Bits2Num_1::@compute(%18) : (!array.type<128 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %19 : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + %5 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@claimType] = %5 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "compute"} + scf.for %arg1 = %c0 to %c32 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %9 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "compute"} + %11 = felt.add %8, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "compute"} + %13 = array.read %10[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %14 = cast.toindex %8 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%14] = %13 : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@i0Bits$inputs] = %pod_0 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@i0Bits] = %6 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum$inputs] = %pod_2 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "compute"} + %7 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimTypeNum] = %7 : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "compute"} + struct.writem %self[@claimFlags] = %nondet : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c32 = arith.constant 32 : index + %c1 = arith.constant 1 : index + %c128 = arith.constant 128 : index + %c0 = arith.constant 0 : index + %felt_const_128 = felt.const 128 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@claimType] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %2 = struct.readm %arg0[@i0Bits] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@i0Bits$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + %4 = struct.readm %arg0[@claimTypeNum] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !struct.type<@Bits2Num_1::@Bits2Num_1<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@claimTypeNum$inputs] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !pod.type<[@in: !array.type<128 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = array.read %arg1[%c0] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c128 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %14 = array.read %12[%13] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = pod.read %5[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %15[%16] : <128 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = struct.readm %4[@out] : <@Bits2Num_1::@Bits2Num_1<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c32 step %c1 { + %11 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = struct.readm %2[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> {product_source = "constrain"} + %13 = felt.add %11, %felt_const_128 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %13 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %12[%14] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %1[%16] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %9 = pod.read %3[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%2, %9) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %10 = pod.read %5[@in] : <[@in: !array.type<128 x !felt.type<"babybear">>]>, !array.type<128 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @Bits2Num_1::@Bits2Num_1::@constrain(%4, %10) : (!struct.type<@Bits2Num_1::@Bits2Num_1<[]>>, !array.type<128 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @Bits2Num_3 { + struct.def @Bits2Num_3 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + function.def @compute(%arg0: !array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %self = struct.new : <@Bits2Num_3::@Bits2Num_3<[]>> + %0:2 = scf.for %arg1 = %c0 to %c64 step %c1 iter_args(%arg2 = %felt_const_1, %arg3 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %2 = cast.toindex %1 : !felt.type<"babybear"> + %3 = array.read %arg0[%2] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %4 = felt.mul %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = felt.add %arg3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg2, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + } + struct.writem %self[@out] = %0#1 : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + function.return %self : !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + } + function.def @constrain(%arg0: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, %arg1: !array.type<64 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> + %felt_const_0 = felt.const 0 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + %1:2 = scf.for %arg2 = %c0 to %c64 step %c1 iter_args(%arg3 = %felt_const_0, %arg4 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %3 = cast.toindex %2 : !felt.type<"babybear"> + %4 = array.read %arg1[%3] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.mul %4, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = felt.add %arg3, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %6, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + } + constrain.eq %0, %1#0 : !felt.type<"babybear">, !felt.type<"babybear"> + function.return + } + } + } + poly.template @getClaimExpiration_4 { + struct.def @getClaimExpiration_4 { + struct.member @expiration : !felt.type<"babybear"> {llzk.pub} + struct.member @expirationBits : !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + struct.member @expirationBits$inputs : !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + struct.member @v0Bits : !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.member @v0Bits$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c4 = arith.constant 4 : index + %felt_const_64 = felt.const 64 : <"babybear"> + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %self = struct.new : <@getClaimExpiration_4::@getClaimExpiration_4<[]>> + %pod = pod.new { @count = %c64 } : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@in: !array.type<64 x !felt.type<"babybear">>]> + %pod_1 = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]> + %pod_2 = pod.new : <[@in: !felt.type<"babybear">]> + %0 = array.read %arg0[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_2[@in] = %0 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %1 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.subi %1, %c1 : index + pod.write %pod_1[@count] = %2 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, index + %3 = arith.cmpi eq, %2, %c0 : index + scf.if %3 { + %8 = pod.read %pod_2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @Num2Bits_0::@Num2Bits_0::@compute(%8) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + pod.write %pod_1[@comp] = %9 : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + } + scf.for %arg1 = %c0 to %c64 step %c1 { + %8 = cast.tofelt %arg1 : index, !felt.type<"babybear"> + %9 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %10 = struct.readm %9[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> + %11 = felt.add %8, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %12 = cast.toindex %11 : !felt.type<"babybear"> + %13 = array.read %10[%12] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %14 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %15 = cast.toindex %8 : !felt.type<"babybear"> + array.write %14[%15] = %13 : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@in] = %14 : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, index + %17 = arith.subi %16, %c1 : index + pod.write %pod[@count] = %17 : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, index + %18 = arith.cmpi eq, %17, %c0 : index + scf.if %18 { + %19 = pod.read %pod_0[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %20 = function.call @Bits2Num_3::@Bits2Num_3::@compute(%19) : (!array.type<64 x !felt.type<"babybear">>) -> !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + pod.write %pod[@comp] = %20 : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + } + } + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + %5 = struct.readm %4[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + struct.writem %self[@expiration] = %5 : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !felt.type<"babybear"> + struct.writem %self[@v0Bits$inputs] = %pod_2 : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %6 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@v0Bits] = %6 : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + struct.writem %self[@expirationBits$inputs] = %pod_0 : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, @params: !pod.type<[]>]>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + struct.writem %self[@expirationBits] = %7 : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + function.return %self : !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> + } + function.def @constrain(%arg0: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c64 = arith.constant 64 : index + %c0 = arith.constant 0 : index + %c4 = arith.constant 4 : index + %felt_const_64 = felt.const 64 : <"babybear"> + %0 = struct.readm %arg0[@expiration] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@expirationBits] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !struct.type<@Bits2Num_3::@Bits2Num_3<[]>> + %2 = struct.readm %arg0[@expirationBits$inputs] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !pod.type<[@in: !array.type<64 x !felt.type<"babybear">>]> + %3 = struct.readm %arg0[@v0Bits] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !struct.type<@Num2Bits_0::@Num2Bits_0<[]>> + %4 = struct.readm %arg0[@v0Bits$inputs] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !pod.type<[@in: !felt.type<"babybear">]> + %5 = array.read %arg1[%c4] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %6, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.for %arg2 = %c0 to %c64 step %c1 { + %10 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %11 = struct.readm %3[@out] : <@Num2Bits_0::@Num2Bits_0<[]>>, !array.type<256 x !felt.type<"babybear">> + %12 = felt.add %10, %felt_const_64 : !felt.type<"babybear">, !felt.type<"babybear"> + %13 = cast.toindex %12 : !felt.type<"babybear"> + %14 = array.read %11[%13] : <256 x !felt.type<"babybear">>, !felt.type<"babybear"> + %15 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + %16 = cast.toindex %10 : !felt.type<"babybear"> + %17 = array.read %15[%16] : <64 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %17, %14 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %7 = struct.readm %1[@out] : <@Bits2Num_3::@Bits2Num_3<[]>>, !felt.type<"babybear"> + constrain.eq %0, %7 : !felt.type<"babybear">, !felt.type<"babybear"> + %8 = pod.read %4[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @Num2Bits_0::@Num2Bits_0::@constrain(%3, %8) : (!struct.type<@Num2Bits_0::@Num2Bits_0<[]>>, !felt.type<"babybear">) -> () + %9 = pod.read %2[@in] : <[@in: !array.type<64 x !felt.type<"babybear">>]>, !array.type<64 x !felt.type<"babybear">> + function.call @Bits2Num_3::@Bits2Num_3::@constrain(%1, %9) : (!struct.type<@Bits2Num_3::@Bits2Num_3<[]>>, !array.type<64 x !felt.type<"babybear">>) -> () + function.return + } + } + } + poly.template @Num2Bits_5 { + struct.def @Num2Bits_5 { + struct.member @out : !array.type<253 x !felt.type<"babybear">> {llzk.pub} + function.def @product(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0 = struct.readm %self[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:4 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1, %arg4 = %felt_const_1, %arg5 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.shr %arg0, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = felt.bit_and %3, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%5] = %4 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "compute"} + %7 = array.read %nondet[%6] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.mul %7, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg2, %8 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %11 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "constrain"} + %12 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %13 = array.read %0[%12] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %14 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %15 = array.read %0[%14] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.sub %15, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = felt.mul %13, %16 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = cast.toindex %11 : !felt.type<"babybear"> {product_source = "constrain"} + %19 = array.read %0[%18] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = felt.mul %19, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %arg5, %20 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.add %arg4, %arg4 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield %9, %10, %22, %21 : !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "fused"} + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + constrain.eq %1#3, %arg0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @compute(%arg0: !felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "compute"} + %self = struct.new : <@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %nondet = llzk.nondet : !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %0:2 = scf.for %arg1 = %c0 to %c253 step %c1 iter_args(%arg2 = %felt_const_0, %arg3 = %felt_const_1) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %1 = cast.tofelt %arg1 : index, !felt.type<"babybear"> {product_source = "compute"} + %2 = felt.shr %arg0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.bit_and %2, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %4 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + array.write %nondet[%4] = %3 : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %5 = cast.toindex %1 : !felt.type<"babybear"> {product_source = "compute"} + %6 = array.read %nondet[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %7 = felt.mul %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %8 = felt.add %arg2, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %9 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + scf.yield {product_source = "compute"} %8, %9 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "compute"} + struct.writem %self[@out] = %nondet : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + } + function.def @constrain(%arg0: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, %arg1: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c253 = arith.constant 253 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %felt_const_0 = felt.const 0 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %1:2 = scf.for %arg2 = %c0 to %c253 step %c1 iter_args(%arg3 = %felt_const_1, %arg4 = %felt_const_0) -> (!felt.type<"babybear">, !felt.type<"babybear">) { + %2 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %3 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %4 = array.read %0[%3] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %5 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %0[%5] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.sub %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = felt.mul %4, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %8, %felt_const_0 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %9 = cast.toindex %2 : !felt.type<"babybear"> {product_source = "constrain"} + %10 = array.read %0[%9] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = felt.mul %10, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %12 = felt.add %arg4, %11 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = felt.add %arg3, %arg3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + scf.yield {product_source = "constrain"} %13, %12 : !felt.type<"babybear">, !felt.type<"babybear"> + } {product_source = "constrain"} + constrain.eq %1#1, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessThan_6 { + struct.def @LessThan_6 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @n2b : !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + struct.member @n2b$inputs : !pod.type<[@in: !felt.type<"babybear">]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %24 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %25 = function.call @Num2Bits_5::@Num2Bits_5::@product(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> + %26 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%24) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %25 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_6::@LessThan_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_6::@LessThan_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %12 = struct.readm %self[@out] : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %13 = struct.readm %self[@n2b] : <@LessThan_6::@LessThan_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %14 = struct.readm %self[@n2b$inputs] : <@LessThan_6::@LessThan_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %15 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = felt.add %15, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %17 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = felt.sub %16, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %19 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %18 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = struct.readm %13[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %21 = array.read %20[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %22 = felt.sub %felt_const_1, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %22 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %23 = pod.read %14[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%13, %23) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessThan_6::@LessThan_6<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c252 = arith.constant 252 : index + %true = arith.constant true + %c0 = arith.constant {product_source = "compute"} 0 : index + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "compute"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c1 = arith.constant {product_source = "compute"} 1 : index + %self = struct.new : <@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c1 } : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !felt.type<"babybear">]> {product_source = "compute"} + bool.assert %true, "assertion failed" {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = felt.add %0, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %2 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %3 : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %4 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %5 = arith.subi %4, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %5 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %6 = arith.cmpi eq, %5, %c0 {product_source = "compute"} : index + scf.if %6 { + %12 = pod.read %pod_0[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %13 = function.call @Num2Bits_5::@Num2Bits_5::@compute(%12) : (!felt.type<"babybear">) -> !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %13 : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + } {product_source = "compute"} + %7 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + %8 = struct.readm %7[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "compute"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %10 : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@n2b$inputs] = %pod_0 : <@LessThan_6::@LessThan_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, @params: !pod.type<[]>]>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + struct.writem %self[@n2b] = %11 : <@LessThan_6::@LessThan_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessThan_6::@LessThan_6<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessThan_6::@LessThan_6<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c252 = arith.constant 252 : index + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %true = arith.constant true + %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 = felt.const 7237005577332262213973186563042994240829374041602535252466099000494570602496 : <"babybear"> {product_source = "constrain"} + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@n2b] : <@LessThan_6::@LessThan_6<[]>>, !struct.type<@Num2Bits_5::@Num2Bits_5<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@n2b$inputs] : <@LessThan_6::@LessThan_6<[]>>, !pod.type<[@in: !felt.type<"babybear">]> {product_source = "constrain"} + bool.assert %true, "assertion failed" {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = felt.add %3, %felt_const_7237005577332262213973186563042994240829374041602535252466099000494570602496 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %5 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %6 = felt.sub %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %7 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = struct.readm %1[@out] : <@Num2Bits_5::@Num2Bits_5<[]>>, !array.type<253 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c252] : <253 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %10 = felt.sub %felt_const_1, %9 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Num2Bits_5::@Num2Bits_5::@constrain(%1, %11) : (!struct.type<@Num2Bits_5::@Num2Bits_5<[]>>, !felt.type<"babybear">) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @LessEqThan_7 { + struct.def @LessEqThan_7 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @lt : !struct.type<@LessThan_6::@LessThan_6<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @LessThan_6::@LessThan_6::@product(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> + %28 = function.call @LessThan_6::@LessThan_6::@compute(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %26 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %27 = function.call @LessThan_6::@LessThan_6::@compute(%26) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %27 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %12 : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@LessEqThan_7::@LessEqThan_7<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %13 : <@LessEqThan_7::@LessEqThan_7<[]>>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + %14 = struct.readm %self[@out] : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %self[@lt] : <@LessEqThan_7::@LessEqThan_7<[]>>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "constrain"} + %16 = struct.readm %self[@lt$inputs] : <@LessEqThan_7::@LessEqThan_7<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %17 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %18 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %19, %17 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %20 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %21 = felt.add %20, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %23 = array.read %22[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %23, %21 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %24 = struct.readm %15[@out] : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %24 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %25 = pod.read %16[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_6::@LessThan_6::@constrain(%15, %25) : (!struct.type<@LessThan_6::@LessThan_6<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> + } + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %c2 = arith.constant {product_source = "compute"} 2 : index + %self = struct.new : <@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %0 = array.read %arg0[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %1 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %1[%c0] = %0 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %1 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %2 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.subi %2, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %3 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %4 = arith.cmpi eq, %3, %c0 {product_source = "compute"} : index + scf.if %4 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @LessThan_6::@LessThan_6::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %5 = array.read %arg0[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %6 = felt.add %5, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "compute"} + %7 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %7[%c1] = %6 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@in] = %7 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %8 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.subi %8, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %9 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %10 = arith.cmpi eq, %9, %c0 {product_source = "compute"} : index + scf.if %10 { + %14 = pod.read %pod_0[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %15 = function.call @LessThan_6::@LessThan_6::@compute(%14) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %15 : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + } {product_source = "compute"} + %11 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + %12 = struct.readm %11[@out] : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@out] = %12 : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_0 : <@LessEqThan_7::@LessEqThan_7<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %13 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@LessThan_6::@LessThan_6<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %13 : <@LessEqThan_7::@LessEqThan_7<[]>>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> + } + function.def @constrain(%arg0: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@out] : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %1 = struct.readm %arg0[@lt] : <@LessEqThan_7::@LessEqThan_7<[]>>, !struct.type<@LessThan_6::@LessThan_6<[]>> {product_source = "constrain"} + %2 = struct.readm %arg0[@lt$inputs] : <@LessEqThan_7::@LessEqThan_7<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + %3 = array.read %arg1[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %4 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %5 = array.read %4[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %5, %3 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %6 = array.read %arg1[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %7 = felt.add %6, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %8 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %7 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %1[@out] : <@LessThan_6::@LessThan_6<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %0, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %2[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessThan_6::@LessThan_6::@constrain(%1, %11) : (!struct.type<@LessThan_6::@LessThan_6<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } + poly.template @MultiMux1_8 { + struct.def @MultiMux1_8 { + struct.member @out : !array.type<1 x !felt.type<"babybear">> {llzk.pub} + function.def @compute(%arg0: !array.type<1,2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %self = struct.new : <@MultiMux1_8::@MultiMux1_8<[]>> + %nondet = llzk.nondet : !array.type<1 x !felt.type<"babybear">> + scf.while (%arg2 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %0 = bool.cmp lt(%arg2, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%0) + } do { + %0 = array.read %arg0[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %1 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = felt.sub %0, %1 : !felt.type<"babybear">, !felt.type<"babybear"> + %3 = felt.mul %2, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = array.read %arg0[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %5 = felt.add %3, %4 : !felt.type<"babybear">, !felt.type<"babybear"> + array.write %nondet[%c0] = %5 : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + struct.writem %self[@out] = %nondet : <@MultiMux1_8::@MultiMux1_8<[]>>, !array.type<1 x !felt.type<"babybear">> + function.return %self : !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + } + function.def @constrain(%arg0: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, %arg1: !array.type<1,2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c0 = arith.constant 0 : index + %felt_const_0 = felt.const 0 : <"babybear"> + %felt_const_1 = felt.const 1 : <"babybear"> + %0 = struct.readm %arg0[@out] : <@MultiMux1_8::@MultiMux1_8<[]>>, !array.type<1 x !felt.type<"babybear">> + scf.while (%arg3 = %felt_const_0) : (!felt.type<"babybear">) -> () { + %1 = bool.cmp lt(%arg3, %felt_const_1) : !felt.type<"babybear">, !felt.type<"babybear"> + scf.condition(%1) + } do { + %1 = array.read %arg1[%c0, %c1] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %2 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %3 = felt.sub %1, %2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = felt.mul %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %5 = array.read %arg1[%c0, %c0] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %6 = felt.add %4, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %7 = array.read %0[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %7, %6 : !felt.type<"babybear">, !felt.type<"babybear"> + scf.yield %felt_const_1 : !felt.type<"babybear"> + } + function.return + } + } + } + poly.template @Mux1_9 { + struct.def @Mux1_9 { + struct.member @out : !felt.type<"babybear"> {llzk.pub} + struct.member @mux : !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + struct.member @mux$inputs : !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + function.def @compute(%arg0: !array.type<2 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness} { + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %c1 = arith.constant 1 : index + %c3 = arith.constant 3 : index + %self = struct.new : <@Mux1_9::@Mux1_9<[]>> + %pod = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]> + %pod_0 = pod.new : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + scf.for %arg2 = %c0 to %c2 step %c1 { + %7 = cast.tofelt %arg2 : index, !felt.type<"babybear"> + %8 = cast.toindex %7 : !felt.type<"babybear"> + %9 = array.read %arg0[%8] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %10 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %11 = cast.toindex %7 : !felt.type<"babybear"> + array.write %10[%c0, %11] = %9 : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + pod.write %pod_0[@c] = %10 : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %12 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, index + %13 = arith.subi %12, %c1 : index + pod.write %pod[@count] = %13 : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, index + %14 = arith.cmpi eq, %13, %c0 : index + scf.if %14 { + %15 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %16 = pod.read %pod_0[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %17 = function.call @MultiMux1_8::@MultiMux1_8::@compute(%15, %16) : (!array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + pod.write %pod[@comp] = %17 : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + } + } + pod.write %pod_0[@s] = %arg1 : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %0 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, index + %1 = arith.subi %0, %c1 : index + pod.write %pod[@count] = %1 : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, index + %2 = arith.cmpi eq, %1, %c0 : index + scf.if %2 { + %7 = pod.read %pod_0[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %8 = pod.read %pod_0[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + %9 = function.call @MultiMux1_8::@MultiMux1_8::@compute(%7, %8) : (!array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + pod.write %pod[@comp] = %9 : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + } + %3 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + %4 = struct.readm %3[@out] : <@MultiMux1_8::@MultiMux1_8<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + struct.writem %self[@out] = %5 : <@Mux1_9::@Mux1_9<[]>>, !felt.type<"babybear"> + struct.writem %self[@mux$inputs] = %pod_0 : <@Mux1_9::@Mux1_9<[]>>, !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + %6 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, @params: !pod.type<[]>]>, !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + struct.writem %self[@mux] = %6 : <@Mux1_9::@Mux1_9<[]>>, !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + function.return %self : !struct.type<@Mux1_9::@Mux1_9<[]>> + } + function.def @constrain(%arg0: !struct.type<@Mux1_9::@Mux1_9<[]>>, %arg1: !array.type<2 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops} { + %c1 = arith.constant 1 : index + %c2 = arith.constant 2 : index + %c0 = arith.constant 0 : index + %0 = struct.readm %arg0[@out] : <@Mux1_9::@Mux1_9<[]>>, !felt.type<"babybear"> + %1 = struct.readm %arg0[@mux] : <@Mux1_9::@Mux1_9<[]>>, !struct.type<@MultiMux1_8::@MultiMux1_8<[]>> + %2 = struct.readm %arg0[@mux$inputs] : <@Mux1_9::@Mux1_9<[]>>, !pod.type<[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + scf.for %arg3 = %c0 to %c2 step %c1 { + %8 = cast.tofelt %arg3 : index, !felt.type<"babybear"> + %9 = cast.toindex %8 : !felt.type<"babybear"> + %10 = array.read %arg1[%9] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> + %11 = pod.read %2[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %12 = cast.toindex %8 : !felt.type<"babybear"> + %13 = array.read %11[%c0, %12] : <1,2 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %13, %10 : !felt.type<"babybear">, !felt.type<"babybear"> + } + %3 = pod.read %2[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + constrain.eq %3, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> + %4 = struct.readm %1[@out] : <@MultiMux1_8::@MultiMux1_8<[]>>, !array.type<1 x !felt.type<"babybear">> + %5 = array.read %4[%c0] : <1 x !felt.type<"babybear">>, !felt.type<"babybear"> + constrain.eq %0, %5 : !felt.type<"babybear">, !felt.type<"babybear"> + %6 = pod.read %2[@c] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<1,2 x !felt.type<"babybear">> + %7 = pod.read %2[@s] : <[@c: !array.type<1,2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> + function.call @MultiMux1_8::@MultiMux1_8::@constrain(%1, %6, %7) : (!struct.type<@MultiMux1_8::@MultiMux1_8<[]>>, !array.type<1,2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () + function.return + } + } + } + poly.template @verifyExpirationTime_10 { + struct.def @verifyExpirationTime_10 { + struct.member @expirationComp : !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> + struct.member @expirationComp$inputs : !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> + struct.member @res : !struct.type<@Mux1_9::@Mux1_9<[]>> + struct.member @res$inputs : !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> + struct.member @header : !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + struct.member @header$inputs : !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> + struct.member @lt : !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> + struct.member @lt$inputs : !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> + function.def @product(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@verifyExpirationTime_10::@verifyExpirationTime_10<[]>> attributes {function.allow_constraint, function.allow_non_native_field_ops, function.allow_witness, llzk.derived} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %arg0[%58] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_4[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %60[%61] = %59 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@claim] = %60 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %62 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %63 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %65 = pod.read %pod_4[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @getClaimHeader_2::@getClaimHeader_2::@product(%65) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> + %67 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%65) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %66 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + %59 = array.read %arg0[%58] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %60 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "compute"} + array.write %60[%61] = %59 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %60 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %62 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %63 = arith.subi %62, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %63 : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %64 = arith.cmpi eq, %63, %c0 {product_source = "compute"} : index + scf.if %64 { + %65 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %66 = function.call @getClaimExpiration_4::@getClaimExpiration_4::@compute(%65) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %66 : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %2 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %57 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @LessEqThan_7::@LessEqThan_7::@product(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> + %59 = function.call @LessEqThan_7::@LessEqThan_7::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + %5 = struct.readm %4[@expiration] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %8 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %57 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = function.call @LessEqThan_7::@LessEqThan_7::@compute(%57) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %58 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %10[%c0] = %felt_const_1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %10 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %12 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %57 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = pod.read %pod_2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @Mux1_9::@Mux1_9::@compute(%57, %58) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %59 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %14 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c1] = %15 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %16 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %57 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = pod.read %pod_2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @Mux1_9::@Mux1_9::@compute(%57, %58) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %59 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %20 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %21 = struct.readm %20[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %22 = array.read %21[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@s] = %22 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %24 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %57 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %58 = pod.read %pod_2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %59 = function.call @Mux1_9::@Mux1_9::@compute(%57, %58) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %59 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_6 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %26 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + struct.writem %self[@expirationComp$inputs] = %pod_0 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + struct.writem %self[@expirationComp] = %27 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + struct.writem %self[@res$inputs] = %pod_2 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %28 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + struct.writem %self[@res] = %28 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_4 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %29 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %30 = struct.readm %self[@expirationComp] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "constrain"} + %31 = struct.readm %self[@expirationComp$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %32 = struct.readm %self[@res] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "constrain"} + %33 = struct.readm %self[@res$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %34 = struct.readm %self[@header] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %35 = struct.readm %self[@header$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %36 = struct.readm %self[@lt] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "constrain"} + %37 = struct.readm %self[@lt$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %arg0[%58] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %35[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %60[%61] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %62, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %57 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "constrain"} + %58 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %59 = array.read %arg0[%58] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %60 = pod.read %31[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %61 = cast.toindex %57 : !felt.type<"babybear"> {product_source = "constrain"} + %62 = array.read %60[%61] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %62, %59 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %38 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %39 = array.read %38[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %39, %arg1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %40 = struct.readm %30[@expiration] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %41 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %42 = array.read %41[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %42, %40 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %43 = pod.read %33[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %44 = array.read %43[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %44, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %45 = struct.readm %36[@out] : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %46 = pod.read %33[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %47 = array.read %46[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %47, %45 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %48 = struct.readm %34[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %49 = array.read %48[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %50 = pod.read %33[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %50, %49 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %51 = struct.readm %32[@out] : <@Mux1_9::@Mux1_9<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %51, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %52 = pod.read %37[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessEqThan_7::@LessEqThan_7::@constrain(%36, %52) : (!struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %53 = pod.read %31[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimExpiration_4::@getClaimExpiration_4::@constrain(%30, %53) : (!struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %54 = pod.read %33[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %55 = pod.read %33[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Mux1_9::@Mux1_9::@constrain(%32, %54, %55) : (!struct.type<@Mux1_9::@Mux1_9<[]>>, !array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %56 = pod.read %35[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%34, %56) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return %self : !struct.type<@verifyExpirationTime_10::@verifyExpirationTime_10<[]>> + } + function.def @compute(%arg0: !array.type<8 x !felt.type<"babybear">>, %arg1: !felt.type<"babybear">) -> !struct.type<@verifyExpirationTime_10::@verifyExpirationTime_10<[]>> attributes {function.allow_non_native_field_ops, function.allow_witness, product_source = "compute"} { + %c0 = arith.constant {product_source = "compute"} 0 : index + %c1 = arith.constant {product_source = "compute"} 1 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "compute"} + %c2 = arith.constant {product_source = "compute"} 2 : index + %c3 = arith.constant {product_source = "compute"} 3 : index + %c8 = arith.constant {product_source = "compute"} 8 : index + %self = struct.new : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>> {product_source = "compute"} + %pod = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_0 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_1 = pod.new { @count = %c3 } : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_2 = pod.new : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %pod_3 = pod.new { @count = %c8 } : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_4 = pod.new : <[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %pod_5 = pod.new { @count = %c2 } : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]> {product_source = "compute"} + %pod_6 = pod.new : <[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_4[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34] = %32 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_4[@claim] = %33 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod_3[@count] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %pod_3[@count] = %36 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %38 = pod.read %pod_4[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @getClaimHeader_2::@getClaimHeader_2::@compute(%38) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + pod.write %pod_3[@comp] = %39 : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + scf.for %arg2 = %c0 to %c8 step %c1 { + %30 = cast.tofelt %arg2 : index, !felt.type<"babybear"> {product_source = "compute"} + %31 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + %32 = array.read %arg0[%31] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + %33 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %34 = cast.toindex %30 : !felt.type<"babybear"> {product_source = "compute"} + array.write %33[%34] = %32 : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_0[@claim] = %33 : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %35 = pod.read %pod[@count] : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %36 = arith.subi %35, %c1 {product_source = "compute"} : index + pod.write %pod[@count] = %36 : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %37 = arith.cmpi eq, %36, %c0 {product_source = "compute"} : index + scf.if %37 { + %38 = pod.read %pod_0[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "compute"} + %39 = function.call @getClaimExpiration_4::@getClaimExpiration_4::@compute(%38) : (!array.type<8 x !felt.type<"babybear">>) -> !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + pod.write %pod[@comp] = %39 : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + } {product_source = "compute"} + } {product_source = "compute"} + %0 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %0[%c0] = %arg1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %0 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %1 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %2 = arith.subi %1, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %2 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %3 = arith.cmpi eq, %2, %c0 {product_source = "compute"} : index + scf.if %3 { + %30 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = function.call @LessEqThan_7::@LessEqThan_7::@compute(%30) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %31 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %4 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + %5 = struct.readm %4[@expiration] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %6 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %6[%c1] = %5 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_6[@in] = %6 : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %7 = pod.read %pod_5[@count] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %8 = arith.subi %7, %c1 {product_source = "compute"} : index + pod.write %pod_5[@count] = %8 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %9 = arith.cmpi eq, %8, %c0 {product_source = "compute"} : index + scf.if %9 { + %30 = pod.read %pod_6[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = function.call @LessEqThan_7::@LessEqThan_7::@compute(%30) : (!array.type<2 x !felt.type<"babybear">>) -> !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + pod.write %pod_5[@comp] = %31 : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + } {product_source = "compute"} + %10 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %10[%c0] = %felt_const_1 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %10 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %11 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %12 = arith.subi %11, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %12 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %13 = arith.cmpi eq, %12, %c0 {product_source = "compute"} : index + scf.if %13 { + %30 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @Mux1_9::@Mux1_9::@compute(%30, %31) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %14 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + %15 = struct.readm %14[@out] : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "compute"} + %16 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + array.write %16[%c1] = %15 : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@c] = %16 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %17 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %18 = arith.subi %17, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %18 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %19 = arith.cmpi eq, %18, %c0 {product_source = "compute"} : index + scf.if %19 { + %30 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @Mux1_9::@Mux1_9::@compute(%30, %31) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + %20 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + %21 = struct.readm %20[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "compute"} + %22 = array.read %21[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "compute"} + pod.write %pod_2[@s] = %22 : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %23 = pod.read %pod_1[@count] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %24 = arith.subi %23, %c1 {product_source = "compute"} : index + pod.write %pod_1[@count] = %24 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, index {product_source = "compute"} + %25 = arith.cmpi eq, %24, %c0 {product_source = "compute"} : index + scf.if %25 { + %30 = pod.read %pod_2[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "compute"} + %31 = pod.read %pod_2[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "compute"} + %32 = function.call @Mux1_9::@Mux1_9::@compute(%30, %31) : (!array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + pod.write %pod_1[@comp] = %32 : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + } {product_source = "compute"} + struct.writem %self[@lt$inputs] = %pod_6 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "compute"} + %26 = pod.read %pod_5[@comp] : <[@count: index, @comp: !struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, @params: !pod.type<[]>]>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + struct.writem %self[@lt] = %26 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "compute"} + struct.writem %self[@expirationComp$inputs] = %pod_0 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %27 = pod.read %pod[@comp] : <[@count: index, @comp: !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + struct.writem %self[@expirationComp] = %27 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "compute"} + struct.writem %self[@res$inputs] = %pod_2 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "compute"} + %28 = pod.read %pod_1[@comp] : <[@count: index, @comp: !struct.type<@Mux1_9::@Mux1_9<[]>>, @params: !pod.type<[]>]>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + struct.writem %self[@res] = %28 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "compute"} + struct.writem %self[@header$inputs] = %pod_4 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "compute"} + %29 = pod.read %pod_3[@comp] : <[@count: index, @comp: !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, @params: !pod.type<[]>]>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + struct.writem %self[@header] = %29 : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "compute"} + function.return {product_source = "compute"} %self : !struct.type<@verifyExpirationTime_10::@verifyExpirationTime_10<[]>> + } + function.def @constrain(%arg0: !struct.type<@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, %arg1: !array.type<8 x !felt.type<"babybear">>, %arg2: !felt.type<"babybear">) attributes {function.allow_constraint, function.allow_non_native_field_ops, product_source = "constrain"} { + %c3 = arith.constant 3 : index + %c1 = arith.constant 1 : index + %c8 = arith.constant 8 : index + %c0 = arith.constant 0 : index + %felt_const_1 = felt.const 1 : <"babybear"> {product_source = "constrain"} + %0 = struct.readm %arg0[@expirationComp] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>> {product_source = "constrain"} + %1 = struct.readm %arg0[@expirationComp$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %2 = struct.readm %arg0[@res] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@Mux1_9::@Mux1_9<[]>> {product_source = "constrain"} + %3 = struct.readm %arg0[@res$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]> {product_source = "constrain"} + %4 = struct.readm %arg0[@header] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>> {product_source = "constrain"} + %5 = struct.readm %arg0[@header$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@claim: !array.type<8 x !felt.type<"babybear">>]> {product_source = "constrain"} + %6 = struct.readm %arg0[@lt] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !struct.type<@LessEqThan_7::@LessEqThan_7<[]>> {product_source = "constrain"} + %7 = struct.readm %arg0[@lt$inputs] : <@verifyExpirationTime_10::@verifyExpirationTime_10<[]>>, !pod.type<[@in: !array.type<2 x !felt.type<"babybear">>]> {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %arg1[%28] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %5[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + scf.for %arg3 = %c0 to %c8 step %c1 { + %27 = cast.tofelt %arg3 : index, !felt.type<"babybear"> {product_source = "constrain"} + %28 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %29 = array.read %arg1[%28] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %30 = pod.read %1[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + %31 = cast.toindex %27 : !felt.type<"babybear"> {product_source = "constrain"} + %32 = array.read %30[%31] : <8 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %32, %29 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + } {product_source = "constrain"} + %8 = pod.read %7[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %9 = array.read %8[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %9, %arg2 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %10 = struct.readm %0[@expiration] : <@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %11 = pod.read %7[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %12 = array.read %11[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %12, %10 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %13 = pod.read %3[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %14 = array.read %13[%c0] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %14, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %15 = struct.readm %6[@out] : <@LessEqThan_7::@LessEqThan_7<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + %16 = pod.read %3[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %17 = array.read %16[%c1] : <2 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %17, %15 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %18 = struct.readm %4[@claimFlags] : <@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<32 x !felt.type<"babybear">> {product_source = "constrain"} + %19 = array.read %18[%c3] : <32 x !felt.type<"babybear">>, !felt.type<"babybear"> {product_source = "constrain"} + %20 = pod.read %3[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %20, %19 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %21 = struct.readm %2[@out] : <@Mux1_9::@Mux1_9<[]>>, !felt.type<"babybear"> {product_source = "constrain"} + constrain.eq %21, %felt_const_1 : !felt.type<"babybear">, !felt.type<"babybear"> {product_source = "constrain"} + %22 = pod.read %7[@in] : <[@in: !array.type<2 x !felt.type<"babybear">>]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @LessEqThan_7::@LessEqThan_7::@constrain(%6, %22) : (!struct.type<@LessEqThan_7::@LessEqThan_7<[]>>, !array.type<2 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %23 = pod.read %1[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimExpiration_4::@getClaimExpiration_4::@constrain(%0, %23) : (!struct.type<@getClaimExpiration_4::@getClaimExpiration_4<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + %24 = pod.read %3[@c] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !array.type<2 x !felt.type<"babybear">> {product_source = "constrain"} + %25 = pod.read %3[@s] : <[@c: !array.type<2 x !felt.type<"babybear">>, @s: !felt.type<"babybear">]>, !felt.type<"babybear"> {product_source = "constrain"} + function.call @Mux1_9::@Mux1_9::@constrain(%2, %24, %25) : (!struct.type<@Mux1_9::@Mux1_9<[]>>, !array.type<2 x !felt.type<"babybear">>, !felt.type<"babybear">) -> () {product_source = "constrain"} + %26 = pod.read %5[@claim] : <[@claim: !array.type<8 x !felt.type<"babybear">>]>, !array.type<8 x !felt.type<"babybear">> {product_source = "constrain"} + function.call @getClaimHeader_2::@getClaimHeader_2::@constrain(%4, %26) : (!struct.type<@getClaimHeader_2::@getClaimHeader_2<[]>>, !array.type<8 x !felt.type<"babybear">>) -> () {product_source = "constrain"} + function.return {product_source = "constrain"} + } + } + } +} + diff --git a/examples/circom-demo/verification_results.csv b/examples/circom-demo/verification_results.csv new file mode 100644 index 0000000..c9601fe --- /dev/null +++ b/examples/circom-demo/verification_results.csv @@ -0,0 +1,901 @@ +Benchmark,Root Struct,Mode,Result,Time Seconds,Message +AveragePooling2D_stride_test,AveragePooling2D_2,verify,timeout,120.110463,timeout +AveragePooling2D_stride_test,AveragePooling2D_2,wp,error,0.197856,"LLVM ERROR: unknown subcomponent type + #0 0x00000001007aefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001007acabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001007afb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +AveragePooling2D_test,AveragePooling2D_2,verify,error,101.920207,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000101192fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000101190abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000101193b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +AveragePooling2D_test,AveragePooling2D_2,wp,error,0.199901,"LLVM ERROR: unknown subcomponent type + #0 0x000000010282afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102828abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010282bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +BatchNormalization_test,BatchNormalization2D_0,verify,verified,84.503644, +BatchNormalization_test,BatchNormalization2D_0,wp,error,0.186564,"LLVM ERROR: multidimensional arrays are not supported + #0 0x000000010324efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010324cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010324fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +Conv1D_test,Conv1D_3,verify,timeout,120.180291,timeout +Conv1D_test,Conv1D_3,wp,error,0.217232,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000104edafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104ed8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104edbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +Conv2D_stride_test,Conv2D_3,verify,timeout,120.121804,timeout +Conv2D_stride_test,Conv2D_3,wp,error,0.231882,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000100d1efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100d1cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100d1fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +Conv2D_test,Conv2D_3,verify,timeout,120.015343,timeout +Conv2D_test,Conv2D_3,wp,error,0.210057,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000102982fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102980abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102983b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +DecomposeProduct,DecomposeProduct_1,verify,error,0.485901,"error: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/DecomposeProduct.llzk"":53:24):failed to legalize operation 'builtin.unrealized_conversion_cast' +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/DecomposeProduct.llzk"":53:24):see current operation: %27 = ""builtin.unrealized_conversion_cast""(%26) : (i1) -> !smt.bool +LLVM ERROR: failed to prepare module for verification + #0 0x0000000102646fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/buil" +DecomposeProduct,DecomposeProduct_1,wp,verified,116.696945,unsat +Dense_test,Dense_3,verify,error,0.988864,"warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/Dense_test.llzk"":15:11):unhandled operation, analysis may be incomplete +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/Dense_test.llzk"":15:11):see current operation: scf.condition(%3) +Assertion failed: (resultNumber < getNumResults() && ""Result number is out of range for operation""), function getOpResultImpl, file /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-mlir-debug-20.1.8-dev/include/mlir/IR/Operation.h, line 1012. + #" +Dense_test,Dense_3,wp,error,0.183193,"LLVM ERROR: unknown subcomponent type + #0 0x00000001049defac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001049dcabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001049dfb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +Flatten2D_test,Flatten2D_0,verify,verified,8.088620, +Flatten2D_test,Flatten2D_0,wp,error,0.202850,"LLVM ERROR: multidimensional arrays are not supported + #0 0x00000001010cefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001010ccabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001010cfb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +GlobalAveragePooling2D_test,GlobalAveragePooling2D_2,verify,timeout,120.122926,timeout +GlobalAveragePooling2D_test,GlobalAveragePooling2D_2,wp,error,0.228987,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102962fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102960abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102963b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +GlobalMaxPooling2D_test,GlobalMaxPooling2D_5,verify,error,21.897936,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000101562fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000101560abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000101563b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +GlobalMaxPooling2D_test,GlobalMaxPooling2D_5,wp,error,0.251296,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102646fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102644abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102647b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +IsNegative_test,IsNegative_4,verify,error,14.873490,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x00000001025bafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001025b8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001025bbb94 Signa" +IsNegative_test,IsNegative_4,wp,error,0.199705,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104b46fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104b44abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104b47b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +IsPositive_test,IsPositive_4,verify,error,13.965208,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x0000000102e9efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102e9cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102e9fb94 Signa" +IsPositive_test,IsPositive_4,wp,error,0.185397,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102f1afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102f18abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102f1bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +MaxPooling2D_stride_test,MaxPooling2D_5,verify,error,32.946765,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001054bafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001054b8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001054bbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +MaxPooling2D_stride_test,MaxPooling2D_5,wp,error,0.213997,"LLVM ERROR: unknown subcomponent type + #0 0x00000001028f2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001028f0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001028f3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +MaxPooling2D_test,MaxPooling2D_5,verify,error,7.588312,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104d0afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104d08abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104d0bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +MaxPooling2D_test,MaxPooling2D_5,wp,error,0.215728,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100d32fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100d30abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100d33b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +Max_test,Max_4,verify,error,4.952770,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000100f7efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100f7cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100f7fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +Max_test,Max_4,wp,error,0.209343,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102816fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102814abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102817b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +Num2Bits,Num2Bits_0,verify,error,0.398763,"error: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/Num2Bits.llzk"":16:16):failed to legalize operation 'felt.shr' that was explicitly marked illegal +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/Num2Bits.llzk"":16:16):see current operation: %107 = ""felt.shr""(<>, %97) {product_source = ""compute""} : (!felt.type<""babybear"">, !felt.type<""babybear"">) -> !felt.type<""babybear""> +LLVM ERROR: failed to generate SMT encoding + #0 0x0000000104d3efac llvm::sys::PrintSt" +Num2Bits,Num2Bits_0,wp,error,0.211538,"(=> true (forall ((x0 Int)) (=> (or (and (<= 0 x0) (< x0 var_316) (= (mod (- x0 0) 1) 0)) (= x0 var_316)) (= (mod (select out_w x0) 2013265921) (mod (select out_c x0) 2013265921))))) +LLVM ERROR: unknown op: felt.bit_and + #0 0x0000000105142fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105140abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105143b94 " +ReLU_test,relu_test_6,verify,error,13.259841,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x00000001047a2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001047a0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001047a3b94 Signa" +ReLU_test,relu_test_6,wp,error,0.196019,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100ad2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100ad0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100ad3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +SumPooling2D_stride_test,SumPooling2D_1,verify,error,59.991091,"warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_stride_test.llzk"":162:15):unhandled operation, analysis may be incomplete +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_stride_test.llzk"":162:15):see current operation: pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0>, @params: !pod.type<[]>]>, index {product_source = ""compute""} +warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPool" +SumPooling2D_stride_test,SumPooling2D_1,wp,error,0.189822,"LLVM ERROR: multidimensional arrays are not supported + #0 0x00000001009dafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001009d8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001009dbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +SumPooling2D_test,SumPooling2D_1,verify,error,7.103914,"warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_test.llzk"":162:15):unhandled operation, analysis may be incomplete +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_test.llzk"":162:15):see current operation: pod.write %0[@count] = %c4 : <[@count: index, @comp: !struct.type<@matElemSum_0::@matElemSum_0>, @params: !pod.type<[]>]>, index {product_source = ""compute""} +warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/SumPooling2D_test.llz" +SumPooling2D_test,SumPooling2D_1,wp,error,0.190786,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000104976fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104974abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104977b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +aes_256_ctr_test,AES256CTR_8,verify,timeout,120.034111,timeout +aes_256_ctr_test,AES256CTR_8,wp,error,0.397014,"LLVM ERROR: unknown subcomponent type + #0 0x000000010068efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010068cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010068fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +aes_256_encrypt_test,AES256Encrypt_6,verify,timeout,120.072214,timeout +aes_256_encrypt_test,AES256Encrypt_6,wp,error,0.538918,"LLVM ERROR: multidimensional arrays are not supported + #0 0x000000010466efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010466cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010466fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +aes_256_key_expansion_test,AES256KeyExpansion_3,verify,error,61.333122,"Assertion failed: (indexAsAttr), function rewriteImpl, file /nix/var/nix/builds/nix-66746-3975906522/source/lib/Dialect/Array/Transforms/ArrayToScalarPass.cpp, line 330. + #0 0x0000000102a6afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102a68abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102a6bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/bu" +aes_256_key_expansion_test,AES256KeyExpansion_3,wp,error,0.306336,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000102a6efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102a6cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102a6fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +aliascheck_test,AliasCheck_2,verify,error,10.027018,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x00000001054f6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001054f4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001054f7b94 Signa" +aliascheck_test,AliasCheck_2,wp,error,0.195955,"LLVM ERROR: unknown subcomponent type + #0 0x00000001011a6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001011a4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001011a7b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +babyadd_tester,BabyAdd_0,verify,verified,6.520150, +babyadd_tester,BabyAdd_0,wp,timeout,120.015740,timeout +babycheck_test,BabyCheck_0,verify,verified,2.156278, +babycheck_test,BabyCheck_0,wp,verified,0.055614,unsat +binsub_test,A_3,verify,error,11.262662,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001011eefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001011ecabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001011efb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +binsub_test,A_3,wp,error,0.192916,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x00000001033f2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001033f0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001033f3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +calculateTotal_test,CalculateTotal_0,verify,verified,0.467446, +calculateTotal_test,CalculateTotal_0,wp,verified,0.091974,unsat +calculateTotal_test_fused,CalculateTotal_0,verify,verified,0.336166, +calculateTotal_test_fused,CalculateTotal_0,wp,verified,0.095286,unsat +chi_test,Chi_6,verify,timeout,120.025980,timeout +chi_test,Chi_6,wp,error,0.410612,"LLVM ERROR: unknown subcomponent type + #0 0x0000000105336fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105334abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105337b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +constants_test,A_1,verify,timeout,120.038489,timeout +constants_test,A_1,wp,error,0.209173,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x000000010542afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105428abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010542bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +decryptMultiple_test,DecryptBits_1,verify,timeout,120.024790,timeout +decryptMultiple_test,DecryptBits_1,wp,error,0.225428,"libc++abi: terminating due to uncaught exception of type cvc5::CVC5ApiException: expecting an arithmetic subterm + #0 0x0000000104b0efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104b0cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104b0fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (" +decrypt_test,Decrypt_1,verify,timeout,120.095678,timeout +decrypt_test,Decrypt_1,wp,error,0.254799,"libc++abi: terminating due to uncaught exception of type cvc5::CVC5ApiException: expecting an arithmetic subterm + #0 0x00000001031e2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001031e0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001031e3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (" +edwards2montgomery,Edwards2Montgomery_0,verify,verified,2.102256, +edwards2montgomery,Edwards2Montgomery_0,wp,partial,0.090326,unknown +encryptMultiple_test,EncryptBits_2,verify,timeout,120.087654,timeout +encryptMultiple_test,EncryptBits_2,wp,error,0.223540,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104e6afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104e68abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104e6bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +encrypt_test,Encrypt_2,verify,error,107.859239,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x000000010490afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104908abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010490bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +encrypt_test,Encrypt_2,wp,error,0.219050,"libc++abi: terminating due to uncaught exception of type cvc5::CVC5ApiException: array select operating on non-array + #0 0x0000000100a52fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100a50abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100a53b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b7" +greatereqthan,GreaterEqThan_2,verify,error,0.517206,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000100b5efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100b5cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100b5fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +greatereqthan,GreaterEqThan_2,wp,error,0.205618,"LLVM ERROR: unknown subcomponent type + #0 0x0000000103192fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000103190abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000103193b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +greaterthan,GreaterThan_2,verify,error,0.496013,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104a86fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104a84abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104a87b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +greaterthan,GreaterThan_2,wp,error,0.187417,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102c1efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102c1cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102c1fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +inTest,IN_5,verify,error,3.839752,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000102ffefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102ffcabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102fffb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +inTest,IN_5,wp,error,0.194317,"LLVM ERROR: unknown subcomponent type + #0 0x00000001006fafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001006f8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001006fbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +iota10_test,Iota_3,verify,timeout,120.052678,timeout +iota10_test,Iota_3,wp,error,0.313424,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102ae2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102ae0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102ae3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +iota3_test,Iota_3,verify,error,11.001604,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x0000000100b86fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100b84abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100b87b94 Signa" +iota3_test,Iota_3,wp,error,0.224791,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104b5afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104b58abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104b5bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +isequal,IsEqual_1,verify,error,0.232017,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000103106fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000103104abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000103107b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +isequal,IsEqual_1,wp,error,0.196418,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x000000010076afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100768abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010076bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +iszero,IsZero_0,verify,verified,0.133330, +iszero,IsZero_0,wp,counterexample,0.081230,sat +keccakfRound0_test,KeccakfRound_88,verify,timeout,120.142991,timeout +keccakfRound0_test,KeccakfRound_88,wp,error,0.945673,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100ff2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100ff0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100ff3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +keccakfRound20_test,KeccakfRound_88,verify,timeout,120.080711,timeout +keccakfRound20_test,KeccakfRound_88,wp,error,0.831672,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102af6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102af4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102af7b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +lesseqthan,LessEqThan_2,verify,error,0.516188,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001051aafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001051a8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001051abb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +lesseqthan,LessEqThan_2,wp,error,0.207458,"LLVM ERROR: unknown subcomponent type + #0 0x0000000105222fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105220abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105223b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +lessthan,LessThan_1,verify,error,0.465035,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104ce2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104ce0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104ce3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +lessthan,LessThan_1,wp,error,0.183751,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x0000000105346fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105344abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105347b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +main,fulladder_0,verify,error,0.214677,"error: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/main.llzk"":17:14):failed to legalize operation 'felt.uintdiv' that was explicitly marked illegal +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/main.llzk"":17:14):see current operation: %38 = ""felt.uintdiv""(%37, %25) {product_source = ""compute""} : (!felt.type<""babybear"">, !felt.type<""babybear"">) -> !felt.type<""babybear""> +LLVM ERROR: failed to generate SMT encoding + #0 0x0000000104a2afac llvm::sys::PrintStackTrace(llvm::raw_" +main,fulladder_0,wp,counterexample,0.059305,sat +matAdd_test,matAdd_0,verify,verified,0.312756, +matAdd_test,matAdd_0,wp,error,0.215474,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000105536fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105534abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105537b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matElemMul_test,matElemMul_0,verify,verified,6.325059, +matElemMul_test,matElemMul_0,wp,error,0.191977,"LLVM ERROR: multidimensional arrays are not supported + #0 0x00000001027a2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001027a0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001027a3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matElemPow_test,matElemPow_1,verify,error,2.873614,"warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matElemPow_test.llzk"":116:13):unhandled operation, analysis may be incomplete +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matElemPow_test.llzk"":116:13):see current operation: pod.write %0[@count] = %c1 : <[@count: index, @comp: !struct.type<@power_0::@power_0>, @params: !pod.type<[]>]>, index {product_source = ""compute""} +warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matElemPow_test.llzk"":116:13):unhan" +matElemPow_test,matElemPow_1,wp,error,0.212670,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000100ccefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100cccabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100ccfb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matMul_test,matMul_2,verify,error,2.970642,"warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matMul_test.llzk"":15:11):unhandled operation, analysis may be incomplete +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matMul_test.llzk"":15:11):see current operation: scf.condition(%3) +Assertion failed: (resultNumber < getNumResults() && ""Result number is out of range for operation""), function getOpResultImpl, file /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-mlir-debug-20.1.8-dev/include/mlir/IR/Operation.h, line 1012. +" +matMul_test,matMul_2,wp,error,0.206741,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000104a8afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104a88abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104a8bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matPow_test,matPow_3,verify,error,8.807000,"warning: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matPow_test.llzk"":15:11):unhandled operation, analysis may be incomplete +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/matPow_test.llzk"":15:11):see current operation: scf.condition(%3) +Assertion failed: (resultNumber < getNumResults() && ""Result number is out of range for operation""), function getOpResultImpl, file /nix/store/eeeeeeeeeeeeeeeeeeeeeeeeeeeeeeee-mlir-debug-20.1.8-dev/include/mlir/IR/Operation.h, line 1012. +" +matPow_test,matPow_3,wp,error,0.191906,"LLVM ERROR: unknown subcomponent type + #0 0x000000010467afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104678abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010467bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +matScalarAdd_test,matScalarAdd_0,verify,verified,0.278180, +matScalarAdd_test,matScalarAdd_0,wp,error,0.192468,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000102c26fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102c24abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102c27b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matScalarMul_test,matScalarMul_0,verify,verified,6.248991, +matScalarMul_test,matScalarMul_0,wp,error,0.187400,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000100f2afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100f28abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100f2bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matScalarSub_test,matScalarSub_0,verify,verified,0.251813, +matScalarSub_test,matScalarSub_0,wp,error,0.175506,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000100b0efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100b0cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100b0fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +matSub_test,matSub_0,verify,verified,0.294055, +matSub_test,matSub_0,wp,error,0.175378,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000104a62fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104a60abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104a63b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +mimc_sponge_hash_test,MiMCSponge_1,verify,timeout,120.025540,timeout +mimc_sponge_hash_test,MiMCSponge_1,wp,error,0.321923,"Checking invariant (forall ((x0 Int)) (=> (and (<= 0 x0) (< x0 4) (= (mod (- x0 0) 1) 0)) true)) +(set-logic ALL) +; Subcomponents +(declare-sort MiMCFeistel_0 0) +(declare-fun init-MiMCFeistel_0 (Int Int Int) MiMCFeistel_0) +(declare-fun read-MiMCFeistel_0-xRout (MiMCFeistel_0) Int) +(declare-fun read-MiMCFeistel_0-t4 (MiMCFeistel_0) (Array Int Int)) +(declare-fun read-MiMCFeistel_0-xR (MiMCFeistel_0) (Array Int Int)) +(declare-fun read-MiMCFeistel_0-t2 (MiMCFeistel_0) (Array Int Int)) +(declare-fun rea" +mimc_sponge_test,MiMCFeistel_0,verify,timeout,120.064461,timeout +mimc_sponge_test,MiMCFeistel_0,wp,error,3.072341,"(=> true (forall ((x0 Int)) (=> (or (and (<= 0 x0) (< x0 var_760) (= (mod (- x0 0) 1) 0)) (= x0 var_760)) (= (mod (select t2_w x0) 2013265921) (mod (select t2_c x0) 2013265921))))) +LLVM ERROR: unknown op: bool.or + #0 0x0000000100d86fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100d84abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100d87b94 SignalH" +mimc_test,MiMC7_0,verify,timeout,120.010111,timeout +mimc_test,MiMC7_0,wp,timeout,120.007847,timeout +mnist_convnet_test,mnist_convnet_21,verify,timeout,120.307851,timeout +mnist_convnet_test,mnist_convnet_21,wp,error,0.273171,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104f46fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104f44abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104f47b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mnist_latest_precision_test,mnist_latest_precision_29,verify,timeout,120.155983,timeout +mnist_latest_precision_test,mnist_latest_precision_29,wp,error,0.309941,"LLVM ERROR: unknown subcomponent type + #0 0x000000010516efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010516cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010516fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mnist_latest_test,mnist_latest_25,verify,timeout,120.113625,timeout +mnist_latest_test,mnist_latest_25,wp,error,0.297888,"LLVM ERROR: unknown subcomponent type + #0 0x0000000105402fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105400abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105403b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mnist_test,mnist_20,verify,timeout,120.199002,timeout +mnist_test,mnist_20,wp,error,0.243849,"LLVM ERROR: unknown subcomponent type + #0 0x000000010266afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102668abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010266bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +model1_test,model1_14,verify,error,14.620374,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x00000001054e2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001054e0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001054e3b94 Signa" +model1_test,model1_14,wp,error,0.302034,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104916fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104914abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104917b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +montgomery2edwards,Montgomery2Edwards_0,verify,verified,2.141793, +montgomery2edwards,Montgomery2Edwards_0,wp,partial,0.072383,unknown +montgomeryadd,MontgomeryAdd_0,verify,verified,3.408402, +montgomeryadd,MontgomeryAdd_0,wp,timeout,120.010250,timeout +montgomerydouble,MontgomeryDouble_0,verify,verified,4.208665, +montgomerydouble,MontgomeryDouble_0,wp,timeout,120.011527,timeout +mul_test,Mul_1,verify,timeout,120.019114,timeout +mul_test,Mul_1,wp,error,0.229478,"LLVM ERROR: multidimensional arrays are not supported + #0 0x00000001032f6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001032f4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001032f7b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +mux1_1,Main_4,verify,error,0.303516,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001030dafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001030d8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001030dbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +mux1_1,Main_4,wp,error,0.210703,"LLVM ERROR: unknown subcomponent type + #0 0x0000000101012fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000101010abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000101013b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mux2_1,Main_4,verify,error,0.407236,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001009e2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001009e0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001009e3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +mux2_1,Main_4,wp,error,0.196747,"LLVM ERROR: unknown subcomponent type + #0 0x0000000105222fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105220abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105223b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mux3_1,Main_4,verify,error,0.843070,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000100bdefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100bdcabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100bdfb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +mux3_1,Main_4,wp,error,0.201441,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100baafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100ba8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100babb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mux4_1,Main_4,verify,error,2.469033,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104f96fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104f94abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104f97b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +mux4_1,Main_4,wp,error,0.246801,"LLVM ERROR: unknown subcomponent type + #0 0x00000001006d2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001006d0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001006d3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +mux_decode,Decoder_0,verify,error,2.290667,"error: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux_decode.llzk"":13:19):unsupported expression op +note: loc(""/Users/raghav/Veridise/LLEQ/examples/circom-demo/mux_decode.llzk"":13:19):see current operation: %129 = ""array.new""() <{mapOpGroupSizes = array, numDimsPerMap = array, operandSegmentSizes = array}> : () -> !array.type<1 x !felt.type<""babybear"">> +LLVM ERROR: SMT emission failed + #0 0x000000010549efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Use" +mux_decode,Decoder_0,wp,partial,0.171895,unknown +mux_ep,EscalarProduct_0,verify,verified,18.137585, +mux_ep,EscalarProduct_0,wp,partial,0.113854,unknown +outer_test,outer_0,verify,verified,6.274205, +outer_test,outer_0,wp,error,0.206317,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000105052fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105050abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105053b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +pad_test,Pad_0,verify,timeout,120.140664,timeout +pad_test,Pad_0,wp,error,0.354087,"Checking invariant (forall ((x0 Int)) (=> (and (<= 0 x0) (< x0 8) (= (mod (- x0 0) 1) 0)) true)) +(set-logic ALL) +(declare-const out2_c (Array Int Int)) +(declare-const out_c (Array Int Int)) +(declare-const out2_w (Array Int Int)) +(declare-const out_w (Array Int Int)) +(assert (forall ((i Int)) (let ((_let_1 (select out2_c i))) (=> (and (<= 0 i) (<= i 1087)) (and (<= 0 _let_1) (<= _let_1 2013265920)))))) +(assert (forall ((i Int)) (let ((_let_1 (select out_c i))) (=> (and (<= 0 i) (<= i 1087)) (and " +pointbits_loopback,Main_9,verify,error,47.179406,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x0000000100ad6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100ad4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100ad7b94 Signa" +pointbits_loopback,Main_9,wp,error,0.214943,"LLVM ERROR: unknown subcomponent type + #0 0x00000001012e6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001012e4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001012e7b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +queryTest,Query_9,verify,error,4.201468,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x000000010059efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010059cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010059fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +queryTest,Query_9,wp,error,0.256721,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104f62fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104f60abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104f63b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +quinGeneratePathIndices_test,QuinGeneratePathIndices_3,verify,error,0.786357,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001025aefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001025acabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001025afb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +quinGeneratePathIndices_test,QuinGeneratePathIndices_3,wp,error,0.190243,"LLVM ERROR: unknown subcomponent type + #0 0x000000010516afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105168abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010516bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +quinSelector_test,QuinSelector_5,verify,error,0.754220,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x000000010501afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105018abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010501bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +quinSelector_test,QuinSelector_5,wp,error,0.259508,"LLVM ERROR: unknown subcomponent type + #0 0x0000000105012fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105010abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000105013b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +rhopi_test,RhoPi_74,verify,timeout,120.015306,timeout +rhopi_test,RhoPi_74,wp,error,0.415375,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102d7efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102d7cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102d7fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +sign_test,Sign_2,verify,error,9.764290,"Assertion failed: ((((slen-1)*64)/22 <= numbits || radix != 10) && ""Insufficient bit width""), function fromString, file /nix/var/nix/builds/nix-24581-489863541/llvm-src-20.1.8/llvm/lib/Support/APInt.cpp, line 2106. + #0 0x00000001031d2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001031d0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001031d3b94 Signa" +sign_test,Sign_2,wp,error,0.190656,"LLVM ERROR: unknown subcomponent type + #0 0x000000010356afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000103568abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010356bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +splicer_test,Splicer_9,verify,error,6.872379,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000102e22fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102e20abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102e23b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +splicer_test,Splicer_9,wp,error,0.225584,"LLVM ERROR: unknown subcomponent type + #0 0x0000000103386fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000103384abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000103387b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +squeeze_test,Squeeze_0,verify,verified,103.495380, +squeeze_test,Squeeze_0,wp,partial,0.242529,unknown +sum_test,A_3,verify,error,91.945571,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000102f46fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102f44abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102f47b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +sum_test,A_3,wp,error,0.229300,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x00000001034fefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001034fcabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001034ffb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +test_bigadd_15,BigAdd_4,verify,error,0.801195,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x000000010103efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010103cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010103fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigadd_15,BigAdd_4,wp,error,0.201996,"LLVM ERROR: unknown subcomponent type + #0 0x0000000101386fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000101384abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000101387b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigadd_23,BigAdd_4,verify,error,0.367226,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104d46fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104d44abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104d47b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigadd_23,BigAdd_4,wp,error,0.272478,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104be2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104be0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104be3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_biglessthan_23,BigLessThan_6,verify,error,1.152394,"LLVM ERROR: while->for conversion failed + #0 0x000000010097efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010097cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010097fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c56" +test_biglessthan_23,BigLessThan_6,wp,error,0.219169,"LLVM ERROR: unknown subcomponent type + #0 0x0000000101406fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000101404abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000101407b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigmod_22,BigMod_16,verify,error,2.712718,"Assertion failed: (!impl->wasOpReplaced(op) && ""attempting to modify a replaced/erased op""), function startOpModification, file /nix/var/nix/builds/nix-63599-2589559352/mlir-debug-src-20.1.8/mlir/lib/Transforms/Utils/DialectConversion.cpp, line 1793. + #0 0x000000010079afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100798abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x100" +test_bigmod_22,BigMod_16,wp,error,0.509703,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104f5afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104f58abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104f5bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigmod_32,BigMod_16,verify,error,2.780302,"Assertion failed: (!impl->wasOpReplaced(op) && ""attempting to modify a replaced/erased op""), function startOpModification, file /nix/var/nix/builds/nix-63599-2589559352/mlir-debug-src-20.1.8/mlir/lib/Transforms/Utils/DialectConversion.cpp, line 1793. + #0 0x00000001029defac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001029dcabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x100" +test_bigmod_32,BigMod_16,wp,error,0.440547,"LLVM ERROR: unknown subcomponent type + #0 0x000000010547afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000105478abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010547bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigmult_21,BigMult_4,verify,error,0.408232,"LLVM ERROR: while->for conversion failed + #0 0x0000000100c06fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100c04abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100c07b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c56" +test_bigmult_21,BigMult_4,wp,error,0.199938,"LLVM ERROR: unknown subcomponent type + #0 0x00000001010b6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001010b4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001010b7b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigmult_22,BigMult_4,verify,error,1.006378,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104a0efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104a0cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104a0fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigmult_22,BigMult_4,wp,error,0.198964,"LLVM ERROR: unknown subcomponent type + #0 0x000000010129efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010129cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010129fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigmult_23,BigMult_4,verify,error,1.683499,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001050aefac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001050acabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001050afb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigmult_23,BigMult_4,wp,error,0.222969,"LLVM ERROR: unknown subcomponent type + #0 0x00000001005b2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001005b0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001005b3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigsub_15,BigSub_6,verify,error,0.837478,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104ddafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104dd8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104ddbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigsub_15,BigSub_6,wp,error,0.210832,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102fb2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102fb0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102fb3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigsub_23,BigSub_6,verify,error,0.552695,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000104612fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104610abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104613b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigsub_23,BigSub_6,wp,error,0.198030,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100dbafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100db8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100dbbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_bigsubmodp_32,BigSubModP_10,verify,error,0.683441,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001007f2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001007f0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001007f3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_bigsubmodp_32,BigSubModP_10,wp,error,0.225202,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100fdafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100fd8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100fdbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_fp12_add_22,Fp12Add_16,verify,error,8.411689,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000100b5afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100b58abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100b5bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_fp12_add_22,Fp12Add_16,wp,error,0.235923,"LLVM ERROR: unknown subcomponent type + #0 0x00000001010bafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001010b8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001010bbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_fp2_add_22,Fp2Add_16,verify,error,1.334122,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000100d86fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100d84abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100d87b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +test_fp2_add_22,Fp2Add_16,wp,error,0.225264,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100ab2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100ab0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100ab3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +test_secp256k1_poc,Secp256k1PointOnCurve_10,verify,error,6.572388,"Assertion failed: (indexAsAttr), function rewriteImpl, file /nix/var/nix/builds/nix-66746-3975906522/source/lib/Dialect/Array/Transforms/ArrayToScalarPass.cpp, line 330. + #0 0x0000000104f9afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104f98abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104f9bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/bu" +test_secp256k1_poc,Secp256k1PointOnCurve_10,wp,error,0.423390,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102db6fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102db4abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102db7b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +theta_test,Theta_9,verify,timeout,120.095237,timeout +theta_test,Theta_9,wp,error,0.387410,"LLVM ERROR: unknown subcomponent type + #0 0x000000010076afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100768abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010076bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +trace_test,trace_1,verify,error,0.267968,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000100ecafac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100ec8abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100ecbb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +trace_test,trace_1,wp,error,0.184617,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000101046fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000101044abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000101047b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +tranpose_test,transpose_0,verify,verified,0.197726, +tranpose_test,transpose_0,wp,error,0.192677,"LLVM ERROR: multidimensional arrays are not supported + #0 0x0000000103522fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000103520abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000103523b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0" +utils_GetValueByIndex,getValueByIndex_3,verify,error,0.731568,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x0000000102c22fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102c20abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102c23b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +utils_GetValueByIndex,getValueByIndex_3,wp,error,0.202706,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102886fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102884abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102887b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +utils_getClaimExpiration,getClaimExpiration_2,verify,timeout,120.058960,timeout +utils_getClaimExpiration,getClaimExpiration_2,wp,error,0.184204,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x000000010342efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010342cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010342fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +utils_getClaimSubjectOtherIden,getClaimSubjectOtherIden_8,verify,timeout,120.079256,timeout +utils_getClaimSubjectOtherIden,getClaimSubjectOtherIden_8,wp,error,0.264539,"LLVM ERROR: unknown subcomponent type + #0 0x0000000100c2afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000100c28abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000100c2bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +utils_getSubjectLocation,getSubjectLocation_1,verify,error,0.364777,"LLVM ERROR: could not create SourceRef child for member reference + #0 0x00000001048d2fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x00000001048d0abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x00000001048d3b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804" +utils_getSubjectLocation,getSubjectLocation_1,wp,error,0.210146,"LLVM ERROR: arbitrary function calls not supported yet + #0 0x000000010121efac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x000000010121cabc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x000000010121fb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 " +utils_isExpirable,isExpirable_0,verify,verified,0.120093, +utils_isExpirable,isExpirable_0,wp,verified,0.080261,unsat +utils_isUpdatable,isUpdatable_0,verify,verified,0.097680, +utils_isUpdatable,isUpdatable_0,wp,verified,0.058359,unsat +utils_verifyCredentialSubject,verifyCredentialSubject_9,verify,timeout,120.015814,timeout +utils_verifyCredentialSubject,verifyCredentialSubject_9,wp,error,0.234534,"LLVM ERROR: unknown subcomponent type + #0 0x0000000104b46fac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000104b44abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000104b47b94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" +utils_verifyExpirationTime,verifyExpirationTime_10,verify,timeout,120.012291,timeout +utils_verifyExpirationTime,verifyExpirationTime_10,wp,error,0.190786,"LLVM ERROR: unknown subcomponent type + #0 0x0000000102e9afac llvm::sys::PrintStackTrace(llvm::raw_ostream&, int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057efac) + #1 0x0000000102e98abc llvm::sys::RunSignalHandlers() (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057cabc) + #2 0x0000000102e9bb94 SignalHandler(int) (/Users/raghav/Veridise/LLEQ/build/tools/lleq/lleq+0x10057fb94) + #3 0x000000018c56b744 (/usr/lib/system/libsystem_platform.dylib+0x1804fb744) + #4 0x000000018c5618d" diff --git a/flake.lock b/flake.lock index 0351761..5eb76b6 100644 --- a/flake.lock +++ b/flake.lock @@ -33,11 +33,11 @@ "release-helpers": "release-helpers" }, "locked": { - "lastModified": 1780068359, - "narHash": "sha256-sps5ePTq94cli+r9X8GkEOEf2NIwKtlM2yy28JM5sJg=", + "lastModified": 1782177587, + "narHash": "sha256-AUtanFo2rn+2G6gThlGkNPYs8QejQoGQGJ/yR5n5Y1w=", "owner": "project-llzk", "repo": "llzk-lib", - "rev": "30b0fa1eb77de154ff60c13fa88ef286d8b01c65", + "rev": "b0f7afd39a9042e700378ad83f8ad4347fd34e62", "type": "github" }, "original": { @@ -132,11 +132,11 @@ ] }, "locked": { - "lastModified": 1778643558, - "narHash": "sha256-4MknVcVcEO3E1dySon+fqGY2QBzYkDJvHuqmzpW9E0A=", + "lastModified": 1780590591, + "narHash": "sha256-nvEp8MipNTJbXjy7enB51FryvJln1Dnwg7Gydkli2ds=", "owner": "project-llzk", "repo": "open-source-release-helpers", - "rev": "95f3c06bf208c68a99a0590b60f77df89e237ee4", + "rev": "b25a037ac3f7ae824b4cd403d651e6c3878d03cf", "type": "github" }, "original": { diff --git a/flake.nix b/flake.nix index 65e5f3e..32ba5bf 100644 --- a/flake.nix +++ b/flake.nix @@ -34,7 +34,7 @@ overlays.default = final: prev: { # Default lleq build uses the default compiler for the system (usually gcc for Linux and clang for Macos) - lleq = (final.callPackage ./nix/lleq.nix { clang = final.clang_20; llzk = final.llzk; mlir = final.mlir; }).overrideAttrs(attr: { + lleq = (final.callPackage ./nix/lleq.nix { clang = final.clang_20; llzk = final.llzk-debug; mlir = final.mlir-debug; }).overrideAttrs(attr: { cmakeBuildType = "Debug"; }); # Build in release with symbols mode with a particular compiler and sanitizers enabled. diff --git a/include/Verification/LoopInvariantGeneration.h b/include/Verification/LoopInvariantGeneration.h new file mode 100644 index 0000000..006295e --- /dev/null +++ b/include/Verification/LoopInvariantGeneration.h @@ -0,0 +1,9 @@ +#pragma once + +#include + +namespace lleq { + +void conjecturePredicates(mlir::scf::ForOp loop); + +} diff --git a/include/Verification/TermUtils.h b/include/Verification/TermUtils.h index e516638..b79a2a2 100644 --- a/include/Verification/TermUtils.h +++ b/include/Verification/TermUtils.h @@ -15,31 +15,78 @@ #include #include #include +#include #include namespace lleq { +static inline std::optional +getArrayDestination(mlir::Value array) { + std::optional destination; + for (auto *user : array.getUsers()) { + if (auto writeOp = mlir::dyn_cast(user)) { + if (destination.has_value()) { + mlir::emitWarning(array.getLoc()) + << "array value written to multiple members\n"; + return {}; + } + destination.emplace(writeOp); + } + } + return destination; +} + +static inline cvc5::Term conjunctAll(llvm::ArrayRef terms, + cvc5::TermManager &mgr) { + if (terms.size() == 0) { + return mgr.mkBoolean(true); + } + if (terms.size() == 1) { + return terms.front(); + } + return mgr.mkTerm(cvc5::Kind::AND, {terms.begin(), terms.end()}); +} + +static inline cvc5::Term disjunctAll(llvm::ArrayRef terms, + cvc5::TermManager &mgr) { + if (terms.size() == 0) { + return mgr.mkBoolean(false); + } + if (terms.size() == 1) { + return terms.front(); + } + return mgr.mkTerm(cvc5::Kind::OR, {terms.begin(), terms.end()}); +} + template concept FormulaTerm = std::convertible_to || std::convertible_to; // A helper class for building common term shapes from MLIR SSA values struct TermBuilder { - using TermSet = std::unordered_set>; + cvc5::TermManager &manager() { return mgr; } + // Build an integer constant cvc5::Term getInteger(llvm::DynamicAPInt val); cvc5::Term getInteger(auto val) { return getInteger(llzk::toDynamicAPInt(val)); } + void addEquivalentMember(llzk::component::MemberDefOp memberDef); + // Return a constant term of the appropriate sort for an SSA value cvc5::Term getConstant(mlir::Value value); // Return a constant of the appropriate sort for a struct member cvc5::Term getConstant(llzk::component::MemberDefOp memberDef, bool isWitness); + cvc5::Term getConstant(llvm::StringRef symbolName, mlir::Type type, + bool isWitness); + + // Trace the use-def chain to build an expression for an SSA value + cvc5::Term getExpression(mlir::Value value); // Return all free variables in `term` that are tracked as constants TermSet getExtraDecls(cvc5::Term term); @@ -86,6 +133,7 @@ struct TermBuilder { cvc5::Sort _sort_of_type(mlir::Type); llvm::DenseMap constants; + llvm::DenseMap expressions; llvm::StringMap witnessMembers, constraintMembers; std::unordered_map> termTypes; @@ -111,7 +159,7 @@ struct TermBuilder { cvc5::Term _get_term(FormulaTerm auto t) { using T = decltype(t); if constexpr (std::convertible_to) { - return getConstant(t); + return getExpression(t); } else { return t; } @@ -126,13 +174,27 @@ struct TermBuilder { // But its better to encode these as `((A1 /\ ... An-1) -> An) /\ ...` // So we have to track our own implication and top-level conjunction terms -// A term of the shape (A1 /\ ... An-1) -> An +struct Range { + cvc5::Term lb, ub, step; +}; + +struct Annotation { + bool isArray; + std::optional arraySlice; +}; + +// A term of the shape (A1 /\ ... /\ An) -> (B1 /\ ... /\ Bm) struct ImplicationTerm { llvm::SmallVector antecedents; - cvc5::Term consequent; + llvm::SmallVector consequents; + + // Optional annotations on each consequent term. The annotation is present if + // the term is expressing equality between two signals, and the `arraySlice` + // field is present if the signals are arrays. + llvm::SmallVector> annotations; static ImplicationTerm of(cvc5::Term term) { - return ImplicationTerm{{}, term}; + return ImplicationTerm{{}, {term}}; } void addAntecedent(cvc5::Term term) { antecedents.push_back(term); } diff --git a/include/Verification/WeakestPrecondition.h b/include/Verification/WeakestPrecondition.h index 6a0e3bb..bf1c9fd 100644 --- a/include/Verification/WeakestPrecondition.h +++ b/include/Verification/WeakestPrecondition.h @@ -8,15 +8,31 @@ #include "Verification/TermUtils.h" #include +#include #include +#include +#include #include +#include #include +#include #include #include #include namespace lleq { +inline llvm::FailureOr +_subcomponent_type(mlir::Type type) { + if (auto structType = mlir::dyn_cast(type)) { + return structType; + } + if (auto arrType = mlir::dyn_cast(type)) { + return _subcomponent_type(arrType.getElementType()); + } + return {}; +} + class WeakestPreconditionAnalysis { llzk::component::StructDefOp structDef; cvc5::TermManager mgr; @@ -25,17 +41,25 @@ class WeakestPreconditionAnalysis { TermBuilder builder; mlir::SymbolTableCollection tables; - cvc5::Term getExpression(mlir::Operation *op); + mlir::FailureOr getExpression(mlir::Operation *op); void calculateWP(mlir::scf::IfOp ifOp, ConjunctionTerm &postcondition); void calculateWP(mlir::Operation *op, ConjunctionTerm &postcondition); void calculateWP(mlir::Block *block, ConjunctionTerm &postcondition); + mlir::DenseMap valueExpressions; + cvc5::Term getExpression(mlir::Value val) { + if (auto it = valueExpressions.find(val); it != valueExpressions.end()) { + return it->second; + } + return builder.getConstant(val); + } + void initSubcomponents() { for (auto memberDef : structDef.getMemberDefs()) { - if (auto structType = mlir::dyn_cast( - memberDef.getType())) { - auto definition = structType.getDefinition( + if (auto structType = _subcomponent_type(memberDef.getType()); + llvm::succeeded(structType)) { + auto definition = structType->getDefinition( tables, structDef->getParentOfType()); llzk::ensure(mlir::succeeded(definition), "could not find struct definition for " + @@ -45,17 +69,34 @@ class WeakestPreconditionAnalysis { } } + void initExpressions() { + structDef.walk([this](mlir::Operation *op) { + if (op->getNumResults() == 1) { + auto expression = getExpression(op); + if (llvm::succeeded(expression)) { + valueExpressions.insert({op->getResult(0), *expression}); + } + } + }); + } + + llvm::FailureOr + computeInvariant(mlir::scf::ForOp loop, const ConjunctionTerm &postcondition); + public: WeakestPreconditionAnalysis(llzk::component::StructDefOp structDef, llzk::Field field) : structDef{structDef}, field{field}, builder{mgr, field} { initSubcomponents(); + initExpressions(); } - cvc5::Term getPostcondition(); + ImplicationTerm getPostcondition(); void populateVerificationConditions(); cvc5::Term generateVerificationConditions(); + void addEquivalentMember(llzk::component::MemberDefOp memberDef); + void emit(llvm::raw_ostream &os); // Generated VCs after doing weakest precondition analysis diff --git a/lib/Analysis/ScalarSymbolAnalysis.cpp b/lib/Analysis/ScalarSymbolAnalysis.cpp index f8cb09a..00c15dc 100644 --- a/lib/Analysis/ScalarSymbolAnalysis.cpp +++ b/lib/Analysis/ScalarSymbolAnalysis.cpp @@ -54,7 +54,7 @@ void ScalarSymbolAnalysis::visitExternalCall( llvm::raw_string_ostream ss{name}; ss << subcmp.getType(); - Symbol x = args.front()->getValue(); + // Symbol x = args.front()->getValue(); Symbol subcmpSym = pool.get().func_call( name, llvm::map_to_vector(args, [this](const Lattice *lat) -> Symbol { diff --git a/lib/Analysis/SymbolicStore.cpp b/lib/Analysis/SymbolicStore.cpp index 12f2d76..835433d 100644 --- a/lib/Analysis/SymbolicStore.cpp +++ b/lib/Analysis/SymbolicStore.cpp @@ -65,8 +65,10 @@ SymbolicStore::buildStore(llzk::component::StructDefOp structDef) { mlir::SymbolTableCollection tables; llzk::LightweightSignalEquivalenceAnalysis equivalence{component}; - if (mlir::failed(llzk::alignStartingAt(component, tables, equivalence))) { - return mlir::failure(); + llzk::ProductAligner aligner{tables, equivalence}; + if (!aligner.alignFuncs(component, component.getComputeFuncOp(), + component.getConstrainFuncOp())) { + return failure(); } } diff --git a/lib/CMakeLists.txt b/lib/CMakeLists.txt index d722518..c4d74f5 100644 --- a/lib/CMakeLists.txt +++ b/lib/CMakeLists.txt @@ -14,6 +14,7 @@ set(Transforms_SRC Transforms/LLEQIfToIfElse.cpp) set(Verification_SRC + Verification/LoopInvariantGeneration.cpp Verification/VerificationUtils.cpp Verification/SMTLIBEquivalenceEmitter.cpp Verification/DeductiveVerifier.cpp diff --git a/lib/Verification/LoopInvariantGeneration.cpp b/lib/Verification/LoopInvariantGeneration.cpp new file mode 100644 index 0000000..ecf6f11 --- /dev/null +++ b/lib/Verification/LoopInvariantGeneration.cpp @@ -0,0 +1,48 @@ +#include "Verification/LoopInvariantGeneration.h" + +#include +#include + +using namespace llzk; +using namespace mlir; + +namespace lleq { + +static inline Block *nestedLoopBody(scf::ForOp loop, + SmallVector &counters) { + counters.push_back(loop.getInductionVar()); + if (auto first = dyn_cast(loop.getBody()->front())) { + return nestedLoopBody(first, counters); + } + return loop.getBody(); +} + +void conjecturePredicates(scf::ForOp loop) { + SmallVector counters; + auto *body = nestedLoopBody(loop, counters); + + DenseSet signalArrays; + SmallVector arrayWrites; + body->walk([&signalArrays, &arrayWrites](array::WriteArrayOp write) { + if (llvm::any_of(write.getArrRef().getUsers(), [](auto *user) { + return llvm::isa(user); + })) { + signalArrays.insert(write.getArrRef()); + arrayWrites.push_back(write); + } + }); + + SmallVector scalarWrites; + body->walk([&scalarWrites, &signalArrays](component::MemberWriteOp write) { + // Skip array-typed member writes (note: if for some reason the loop + // writes a full array to a struct member each iteration this may miss + // it, but there's no indices for us to do anything about in that case + // anyway) + auto val = write.getVal(); + if (!isa(val.getType())) { + scalarWrites.push_back(write); + } + }); +} + +} // namespace lleq diff --git a/lib/Verification/TermUtils.cpp b/lib/Verification/TermUtils.cpp index 4b336c5..b74b157 100644 --- a/lib/Verification/TermUtils.cpp +++ b/lib/Verification/TermUtils.cpp @@ -4,24 +4,42 @@ */ #include "Verification/TermUtils.h" +#include "Analysis/ScalarSymbolAnalysis.h" #include #include #include #include #include +#include #include +#include #include +#include #include +#include +#include +#include +#include +#include #include +#include #include #include #include +#include #include +#include +#include #include +using namespace llzk; using namespace mlir; +using array::ReadArrayOp; +using component::MemberReadOp; +using felt::FeltConstantOp; + namespace lleq { void TermBuilder::populateSubcomponent(llzk::component::StructDefOp subcmp) { @@ -34,9 +52,15 @@ void TermBuilder::populateSubcomponent(llzk::component::StructDefOp subcmp) { for (auto type : subcmp.getComputeFuncOp().getFunctionType().getInputs()) { argumentSorts.push_back(_sort_of_type(type)); } - cvc5::Sort initFuncSort = mgr.mkFunctionSort(std::move(argumentSorts), sort); - cvc5::Term initFunc = mgr.mkConst(initFuncSort, "init-" + subcmpName); - subcmpInits.insert({subcmp.getType(), initFunc}); + if (argumentSorts.empty()) { + cvc5::Term initConst = mgr.mkConst(sort, "init-" + subcmpName); + subcmpInits.insert({subcmp.getType(), initConst}); + } else { + cvc5::Sort initFuncSort = + mgr.mkFunctionSort(std::move(argumentSorts), sort); + cvc5::Term initFunc = mgr.mkConst(initFuncSort, "init-" + subcmpName); + subcmpInits.insert({subcmp.getType(), initFunc}); + } // For each `@B::struct.member @foo : T` => `(decl-fun read-B-foo (B) T)` for (auto memberDef : subcmp.getMemberDefs()) { @@ -92,6 +116,10 @@ TermBuilder::TermSet TermBuilder::getDeclBounds(TermSet decls, TermSet bounds; for (auto var : decls) { if (var.getSort().isArray()) { + if (var.getSort().getArrayElementSort().isUninterpretedSort()) { + // Don't need bounds for subcomponent arrays + continue; + } std::optional size; if (auto it = termTypes.find(var); it != termTypes.end()) { size = sizeOfType(it->second); @@ -110,6 +138,13 @@ TermBuilder::TermSet TermBuilder::getDeclBounds(TermSet decls, return bounds; } +static inline cvc5::Sort getElementSortOrSelf(cvc5::Sort s) { + if (s.isArray()) { + return getElementSortOrSelf(s.getArrayElementSort()); + } + return s; +} + void TermBuilder::emitSubcmpDeclarations(llvm::raw_ostream &os) { if (subcmpSorts.empty()) { return; @@ -153,34 +188,193 @@ cvc5::Sort TermBuilder::_sort_of_type(Type type) { return mgr.getIntegerSort(); } +cvc5::Term TermBuilder::getExpression(mlir::Value value) { + // If we've already cached a value, just look it up + if (auto it = expressions.find(value); it != expressions.end()) { + return it->second; + } + + Operation *op = value.getDefiningOp(); + // TODO: we could theoretically handle a value yielded from an scf.if with + // multiple values + if (op == nullptr || op->getNumResults() != 1) { + return getConstant(value); + } + + // If its a basic arithmetic operation we can build it directly + static llvm::DenseMap opToTermKind = { + {"felt.add", cvc5::Kind::ADD}, + {"felt.sub", cvc5::Kind::SUB}, + {"felt.mul", cvc5::Kind::MULT}, + {"felt.smod", cvc5::Kind::INTS_MODULUS}, + {"felt.umod", cvc5::Kind::INTS_MODULUS}, + {"felt.sintdiv", cvc5::Kind::INTS_DIVISION}, + {"felt.uintdiv", cvc5::Kind::INTS_DIVISION}, + {"felt.div", cvc5::Kind::INTS_DIVISION}, + {"felt.neg", cvc5::Kind::NEG}, + {"arith.addi", cvc5::Kind::ADD}, + {"arith.subi", cvc5::Kind::SUB}}; + + if (auto it = opToTermKind.find(op->getName().getStringRef()); + it != opToTermKind.end()) { + SmallVector operandTerms{ + llvm::map_to_vector(op->getOperands(), [this](Value value) { + return getExpression(value); + })}; + auto expression = + mgr.mkTerm(it->second, {operandTerms.begin(), operandTerms.end()}); + expressions.insert({value, expression}); + return expression; + } + + // Otherwise, switch on the type of the operation + auto expression = + llvm::TypeSwitch(op) + .Case([this, op](boolean::CmpOp cmp) { + static llvm::DenseMap + predicateToKind = { + {boolean::FeltCmpPredicate::EQ, cvc5::Kind::EQUAL}, + {boolean::FeltCmpPredicate::LT, cvc5::Kind::LT}, + {boolean::FeltCmpPredicate::LE, cvc5::Kind::LEQ}, + {boolean::FeltCmpPredicate::GT, cvc5::Kind::GT}, + {boolean::FeltCmpPredicate::GE, cvc5::Kind::GEQ}}; + SmallVector operandTerms{ + llvm::map_to_vector(op->getOperands(), [this](Value value) { + return getExpression(value); + })}; + if (cmp.getPredicate() == boolean::FeltCmpPredicate::NE) { + return mgr + .mkTerm(predicateToKind.at(boolean::FeltCmpPredicate::EQ), + {operandTerms.begin(), operandTerms.end()}) + .notTerm(); + } + return mgr.mkTerm(predicateToKind.at(cmp.getPredicate()), + {operandTerms.begin(), operandTerms.end()}); + }) + .Case([this](MemberReadOp read) { + read.getType(); + return getConstant(read.getMemberName(), read.getType(), + isWitnessOp(read)); + }) + .Case([this](ReadArrayOp read) { + llzk::ensure(read.getIndices().size() == 1, + "multidimensional arrays are not supported"); + return arrayRead(read.getArrRef(), read.getIndices().front()); + }) + .Case([this](FeltConstantOp constOp) { + SmallString<64> str; + constOp.getValue().getValue().toStringUnsigned(str); + return mgr.mkInteger(std::string{str}); + }) + .Case( + [this](auto constOp) { + auto val = dyn_cast(constOp.getValue()).getValue(); + return getInteger(val); + }) + .Case([this](array::CreateArrayOp createArr) { + // If the array is written to exactly one struct member later, just + // materialize a symbol for that directly + auto destination = getArrayDestination(createArr.getResult()); + if (destination.has_value()) { + return getConstant(destination->getMemberName(), + createArr.getType(), true); + } + return getConstant(createArr.getResult()); + }) + .Case([this](llzk::NonDetOp nondet) { + if (isa(nondet.getType())) { + // If its using llzk.nondet to initialize an array, just copy the + // array logic + auto destination = getArrayDestination(nondet.getResult()); + if (destination.has_value()) { + return getConstant(destination->getMemberName(), + nondet.getType(), true); + } + } + + return getConstant(nondet.getResult()); + }) + .Case( + [this](auto op) { return getExpression(op.getValue()); }) + .Case( + [this](UnrealizedConversionCastOp cast) { + return getExpression(cast.getInputs().front()); + }) + .Case([this](scf::IfOp ifOp) { + auto trueValue = + getExpression(ifOp.thenYield().getResults().front()); + auto falseValue = + getExpression(ifOp.elseYield().getResults().front()); + auto condition = getExpression(ifOp.getCondition()); + return mgr.mkTerm(cvc5::Kind::ITE, + {condition, trueValue, falseValue}); + }) + .Case([this](auto) -> cvc5::Term { + llvm::report_fatal_error("loop-yielded values not yet supported"); + }) + .Case([this](llzk::function::CallOp call) { + // For now just deal with calls to @compute and error out on other + // function calls + SymbolTableCollection tables; + llzk::ensure(call.calleeIsCompute(), + "arbitrary function calls not supported yet"); + auto target = call.getCalleeTarget(tables); + llzk::ensure(succeeded(target), "failed to resolve callee target"); + SmallVector args = call.getArgOperands(); + return initSubcmp( + target->get()->getParentOfType(), args); + }) + .Default([op](auto) -> cvc5::Term { + llvm::report_fatal_error("unknown op: " + + op->getName().getStringRef()); + }); + + expressions.insert({value, expression}); + return expression; +} + cvc5::Term TermBuilder::getConstant(Value value) { if (auto it = constants.find(value); it != constants.end()) { return it->second; } std::optional name; - if (auto blockArg = dyn_cast(value)) { - name.emplace("arg" + std::to_string(blockArg.getArgNumber())); - } + // if (auto blockArg = dyn_cast(value)) { + // name.emplace("arg" + std::to_string(blockArg.getArgNumber())); + // } auto newConst = mgr.mkConst(_sort_of_type(value.getType()), name); constants.insert({value, newConst}); termTypes.insert({newConst, value.getType()}); return newConst; } -cvc5::Term TermBuilder::getConstant(llzk::component::MemberDefOp memberDef, + +void TermBuilder::addEquivalentMember(component::MemberDefOp memberDef) { + StringRef memberName = memberDef.getSymName(); + auto memberConst = + mgr.mkConst(_sort_of_type(memberDef.getType()), memberName.str()); + + witnessMembers.insert({memberName, memberConst}); + constraintMembers.insert({memberName, memberConst}); + termTypes.insert({memberConst, memberDef.getType()}); +} + +cvc5::Term TermBuilder::getConstant(component::MemberDefOp memberDef, + bool isWitness) { + return getConstant(memberDef.getSymName(), memberDef.getType(), isWitness); +} +cvc5::Term TermBuilder::getConstant(StringRef memberName, Type type, bool isWitness) { auto &memberMap = isWitness ? witnessMembers : constraintMembers; - auto memberName = memberDef.getSymName(); if (auto it = memberMap.find(memberName); it != memberMap.end()) { return it->second; } - auto newTerm = mgr.mkConst(_sort_of_type(memberDef.getType()), + auto newTerm = mgr.mkConst(_sort_of_type(type), (memberName + (isWitness ? "_w" : "_c")).str()); memberMap.insert({memberName, newTerm}); - termTypes.insert({newTerm, memberDef.getType()}); + termTypes.insert({newTerm, type}); return newTerm; } @@ -216,6 +410,8 @@ cvc5::Term TermBuilder::readSubcmpMember(mlir::Value subcmp, } cvc5::Term TermBuilder::_is_mod(cvc5::Term val, llvm::DynamicAPInt mod) { + llzk::ensure(val.getSort().isInteger(), + "cannot bound non-integral sort modulo"); return mgr.mkTerm(cvc5::Kind::LEQ, {getInteger(0), val, getInteger(mod - 1)}); } @@ -289,20 +485,19 @@ cvc5::Term TermBuilder::_array_write_impl(cvc5::Term arr, cvc5::Term index, } cvc5::Term ImplicationTerm::buildTerm(cvc5::TermManager &mgr) { - if (antecedents.empty()) { - return consequent; - } - - auto antecedent = - mgr.mkTerm(cvc5::Kind::AND, {antecedents.begin(), antecedents.end()}); - return mgr.mkTerm(cvc5::Kind::IMPLIES, {antecedent, consequent}); + llvm::SmallVector consequentTerms{consequents.begin(), + consequents.end()}; + return mgr.mkTerm(cvc5::Kind::IMPLIES, {conjunctAll(antecedents, mgr), + conjunctAll(consequentTerms, mgr)}); } void ImplicationTerm::substitute(cvc5::Term oldTerm, cvc5::Term newTerm) { for (auto &antecedent : antecedents) { antecedent = antecedent.substitute(oldTerm, newTerm); } - consequent = consequent.substitute(oldTerm, newTerm); + for (auto &consequent : consequents) { + consequent = consequent.substitute(oldTerm, newTerm); + } } void ConjunctionTerm::addConjunct(const ImplicationTerm &term) { diff --git a/lib/Verification/VerificationUtils.cpp b/lib/Verification/VerificationUtils.cpp index 2741835..b354e27 100644 --- a/lib/Verification/VerificationUtils.cpp +++ b/lib/Verification/VerificationUtils.cpp @@ -9,6 +9,8 @@ #include #include #include +#include +#include using namespace mlir; using namespace llzk; @@ -37,7 +39,14 @@ llvm::LogicalResult ensureProductFunc(ModuleOp module, << "failed to align @compute/@constrain into @product"; } - return aligner.alignCalls(productFunc); + if (llvm::failed(aligner.alignCalls(productFunc))) { + return llvm::failure(); + } + + // Now, try fusing loops + PassManager pm{module->getContext()}; + pm.addPass(llzk::createFuseProductLoopsPass()); + return pm.run(module); } } // namespace lleq diff --git a/lib/Verification/WeakestPrecondition.cpp b/lib/Verification/WeakestPrecondition.cpp index 35bb99c..e0a54c9 100644 --- a/lib/Verification/WeakestPrecondition.cpp +++ b/lib/Verification/WeakestPrecondition.cpp @@ -8,25 +8,37 @@ #include "Verification/TermUtils.h" #include "Verification/VerificationUtils.h" +#include +#include #include #include #include #include +#include #include +#include +#include +#include +#include #include #include #include #include #include +#include #include #include +#include #include +#include #include #include #include #include +#include +#include #include using namespace llzk; @@ -41,30 +53,499 @@ using felt::FeltConstantOp; namespace lleq { +struct LoopCounterInfo { + cvc5::Term counter; + Range range; +}; + +namespace { + +std::string resolveZ3Path() { + if (std::optional envPath = + llvm::sys::Process::GetEnv("LLEQ_Z3")) { + if (llvm::sys::fs::can_execute(*envPath)) { + return *envPath; + } + llvm::report_fatal_error(StringRef{"LLEQ_Z3 is set to '"} + *envPath + + "', but that path is not executable"); + } + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Wdeprecated-declarations" + auto solverPath = llvm::sys::findProgramByName("z3"); +#pragma clang diagnostic pop + if (!solverPath) { + llvm::report_fatal_error( + "could not find an executable z3 binary; install z3 or set LLEQ_Z3 " + "to the full path of the solver binary"); + } + return *solverPath; +} + +std::string buildSMTQuery(cvc5::Term query, TermBuilder &builder, + llzk::Field field) { + auto extraDecls = builder.getExtraDecls(query); + auto bounds = builder.getDeclBounds(extraDecls, field.prime()); + std::string queryStr; + llvm::raw_string_ostream os{queryStr}; + + os << "(set-logic ALL)\n"; + builder.emitSubcmpDeclarations(os); + for (auto decl : extraDecls) { + os << "(declare-const " << decl.toString() << " " + << decl.getSort().toString() << ")\n"; + } + for (auto bound : bounds) { + os << "(assert " << bound.toString() << ")\n"; + } + os << "(assert " << query.notTerm().toString() << ")\n"; + os << "(check-sat)\n"; + return queryStr; +} + +bool checkUnsatWithZ3(StringRef query) { + int stdinFd = -1; + SmallString<128> tempStdin; + llzk::ensure(llvm::sys::fs::createTemporaryFile("lleq-z3-stdin", "smt2", + stdinFd, tempStdin) == + std::error_code{}, + "failed to create temporary file for z3 stdin"); + int stdoutFd = -1; + SmallString<128> tempStdout; + llzk::ensure(llvm::sys::fs::createTemporaryFile("lleq-z3-stdout", "txt", + stdoutFd, tempStdout) == + std::error_code{}, + "failed to create temporary file for z3 stdout"); + + std::ofstream os{tempStdin.c_str()}; + os.write(query.data(), query.size()); + os.close(); + if (stdinFd >= 0) { + ::close(stdinFd); + } + if (stdoutFd >= 0) { + ::close(stdoutFd); + } + + auto solverPath = resolveZ3Path(); + SmallVector args{solverPath, "-smt2", tempStdin}; + + std::string error; + auto code = llvm::sys::ExecuteAndWait(solverPath, args, + /*Env=*/std::nullopt, + /*Redirects=*/ + {"", std::string{tempStdout}, ""}, 0, 0, + &error); + if (code) { + llvm::report_fatal_error(error.c_str()); + } + + std::ifstream is{tempStdout.c_str()}; + std::string result; + is >> result; + llvm::sys::fs::remove(tempStdin); + llvm::sys::fs::remove(tempStdout); + return result == "unsat"; +} + +Block *nestedLoopBody(scf::ForOp loop, SmallVector &loopInfo, + TermBuilder &builder) { + loopInfo.push_back( + LoopCounterInfo{builder.getExpression(loop.getInductionVar()), + Range{builder.getExpression(loop.getLowerBound()), + builder.getExpression(loop.getUpperBound()), + builder.getExpression(loop.getStep())}}); + if (auto first = dyn_cast(loop.getBody()->front())) { + return nestedLoopBody(first, loopInfo, builder); + } + return loop.getBody(); +} + +struct FailingCore { + SmallVector terms; + SmallVector annotations; +}; + +cvc5::Term valueInRange(cvc5::Term value, Range range, cvc5::TermManager &mgr) { + auto [lb, ub, step] = range; + auto lBound = mgr.mkTerm(cvc5::Kind::LEQ, {lb, value}); + auto uBound = mgr.mkTerm(cvc5::Kind::LT, {value, ub}); + auto sBound = + mgr.mkTerm(cvc5::Kind::EQUAL, + {mgr.mkTerm(cvc5::Kind::INTS_MODULUS, + {mgr.mkTerm(cvc5::Kind::SUB, {value, lb}), step}), + mgr.mkInteger(0)}); + return conjunctAll({lBound, uBound, sBound}, mgr); +} + +// Returns the lexicographic prefix of the nested iteration space induced by +// `counters` and `ranges`. +// +// With `stepIter == false`, this is the set of tuples strictly before the +// current tuple `counters`. +// +// With `stepIter == true`, this is the set of tuples strictly before the +// lexicographic successor of `counters`, i.e. the visited region after the +// current body iteration executes once. +cvc5::Term getLoopAntecedent(ArrayRef variables, + ArrayRef counters, + ArrayRef ranges, cvc5::TermManager &mgr, + bool stepIter = false) { + llzk::ensure(variables.size() == counters.size() && + counters.size() == ranges.size(), + "mismatched loop info"); + + auto successorCounter = [&](int dim) -> cvc5::Term { + if (!stepIter) { + return counters[dim]; + } + + cvc5::Term result = counters[dim]; + for (int carryAt = counters.size() - 1; carryAt >= 0; carryAt--) { + SmallVector carryCondition; + + // All inner counters must be exhausted, otherwise the carry occurs at a + // deeper nesting level. + for (int inner = carryAt + 1; inner < counters.size(); inner++) { + auto [innerLb, innerUb, innerStep] = ranges[inner]; + auto innerNext = + mgr.mkTerm(cvc5::Kind::ADD, {counters[inner], innerStep}); + carryCondition.push_back( + mgr.mkTerm(cvc5::Kind::NOT, + {mgr.mkTerm(cvc5::Kind::LT, {innerNext, innerUb})})); + } + + // The carry lands here only if this counter can still advance. + auto [carryLb, carryUb, carryStep] = ranges[carryAt]; + auto carryNext = + mgr.mkTerm(cvc5::Kind::ADD, {counters[carryAt], carryStep}); + carryCondition.push_back( + mgr.mkTerm(cvc5::Kind::LT, {carryNext, carryUb})); + + cvc5::Term successorValue = counters[dim]; + if (dim == carryAt) { + successorValue = + mgr.mkTerm(cvc5::Kind::ADD, {counters[dim], ranges[dim].step}); + } else if (dim > carryAt) { + successorValue = ranges[dim].lb; + } + + result = mgr.mkTerm(cvc5::Kind::ITE, {conjunctAll(carryCondition, mgr), + successorValue, result}); + } + + return result; + }; + + SmallVector disjuncts; + for (auto [i, info] : + llvm::enumerate(llvm::zip(variables, counters, ranges))) { + auto [x, k, r] = info; + SmallVector conjuncts; + conjuncts.push_back( + valueInRange(x, Range{r.lb, successorCounter(i), r.step}, mgr)); + for (int j = 0; j < i; j++) { + conjuncts.push_back( + mgr.mkTerm(cvc5::Kind::EQUAL, {successorCounter(j), variables[j]})); + } + for (int j = i + 1; j < variables.size(); j++) { + conjuncts.push_back(valueInRange(variables[j], ranges[j], mgr)); + } + disjuncts.push_back(conjunctAll(conjuncts, mgr)); + } + + return disjunctAll(disjuncts, mgr); +} + +cvc5::Term currentIterationTuple(ArrayRef variables, + ArrayRef counters, + cvc5::TermManager &mgr) { + llzk::ensure(variables.size() == counters.size(), "mismatched loop info"); + + SmallVector equalities; + for (auto [x, k] : llvm::zip(variables, counters)) { + equalities.push_back(mgr.mkTerm(cvc5::Kind::EQUAL, {x, k})); + } + return conjunctAll(equalities, mgr); +} + +// Turn `predicate(var)` into `forall x in range(lb, ub, step), predicate(x)` +// cvc5::Term quantifyPredicate(cvc5::Term predicate, +// SmallVector counters, +// SmallVector ranges, cvc5::TermManager +// &mgr, bool stepIter = false) { +// llzk::ensure(counters.size() == ranges.size(), "mismatched loop info"); + +// SmallVector vars; +// for (int i = 0; i < counters.size(); i++) { +// vars.push_back(mgr.mkVar(mgr.getIntegerSort(), "x" + std::to_string(i))); +// } + +// auto bound = getLoopAntecedent(vars, counters, ranges, mgr, stepIter); +// return mgr.mkTerm( +// cvc5::Kind::FORALL, +// {mgr.mkTerm(cvc5::Kind::VARIABLE_LIST, {vars.begin(), vars.end()}), +// mgr.mkTerm( +// cvc5::Kind::IMPLIES, +// {bound, predicate.substitute({counters.begin(), counters.end()}, +// {vars.begin(), vars.end()})})}); +// } + +// Turn `predicate(vars...)` into `forall xs, bound(xs...) => predicate(xs...)` +cvc5::Term +quantifyPredicate(cvc5::Term predicate, ArrayRef vars, + std::function)> bound, + cvc5::TermManager &mgr) { + std::vector xs; + for (int i = 0; i < vars.size(); i++) { + xs.push_back(mgr.mkVar(mgr.getIntegerSort(), "x" + std::to_string(i))); + } + + auto predicateBound = bound(xs); + return mgr.mkTerm( + cvc5::Kind::FORALL, + {mgr.mkTerm(cvc5::Kind::VARIABLE_LIST, xs), + mgr.mkTerm(cvc5::Kind::IMPLIES, + {predicateBound, + predicate.substitute({vars.begin(), vars.end()}, xs)})}); +} + +FailingCore getFailingCore(cvc5::Term invariant, + const ConjunctionTerm &postcondition, + TermBuilder &builder, llzk::Field field) { + FailingCore core; + auto &mgr = builder.manager(); + for (auto conjunction : postcondition.conjuncts) { + auto antecedent = conjunctAll(conjunction.antecedents, mgr); + for (auto [consequent, annotation] : + llvm::zip(conjunction.consequents, conjunction.annotations)) { + auto fails = + mgr.mkTerm(cvc5::Kind::IMPLIES, + {conjunctAll({invariant, antecedent}, mgr), consequent}); + if (!checkUnsatWithZ3(buildSMTQuery(fails, builder, field))) { + core.terms.push_back(consequent); + llzk::ensure(annotation.has_value(), + "cannot produce unannotated failing core"); + core.annotations.push_back(*annotation); + } + } + } + return core; +} + +} // namespace + +FailureOr WeakestPreconditionAnalysis::computeInvariant( + scf::ForOp loop, const ConjunctionTerm &postcondition) { + SmallVector loopInfo; + auto *body = nestedLoopBody(loop, loopInfo, builder); + + // Maps a witness *array* that's written in the loop to the index at which its + // written + DenseMap witnessWrites; + body->walk([&witnessWrites](array::WriteArrayOp write) { + llzk::ensure(write.getIndices().size() == 1, + "multidimensional arrays not yet supported"); + auto dest = getArrayDestination(write.getArrRef()); + if (dest.has_value()) { + witnessWrites.insert({*dest, write.getIndices().front()}); + } + }); + + // llzk::ensure(loopInfo.size() == 1, "nested loop support in-progress"); + + SmallVector loopCounters; + SmallVector loopBounds; + for (auto [counter, bound] : loopInfo) { + loopCounters.push_back(counter); + loopBounds.push_back(bound); + } + + // auto [i, range] = loopInfo.front(); + // auto [lb, ub, step] = range; + + SmallVector predicates; + SmallVector indices; + SmallVector arraySizes; + for (auto [write, index] : witnessWrites) { + auto memberDef = write.getMemberDefOp(tables)->get(); + auto arr_w_i = + builder.arrayRead(builder.getConstant(memberDef, true), index); + auto arr_c_i = + builder.arrayRead(builder.getConstant(memberDef, false), index); + predicates.push_back(builder.assertEqual(arr_w_i, arr_c_i)); + indices.push_back(builder.getExpression(index)); + + // We've already asserted that the array is not multidimensional + arraySizes.push_back( + dyn_cast(memberDef.getType()).getShape().front()); + } + + // Filter out which predicates are inductive + SmallVector inductivePredicates; + // Conjuncts necessary to strengthen the inductive invariant + // forall x in range(lb, i, step), forall sig, sig_c[x] == sig_w[x] + cvc5::Term bodyPrecondition = quantifyPredicate( + conjunctAll(predicates, mgr), loopCounters, + [this, &loopCounters, &loopBounds](auto xs) { + return getLoopAntecedent(xs, loopCounters, loopBounds, mgr); + }, + mgr); + + SmallVector strengthenings; + for (auto [size, predicate, index] : + llvm::zip(arraySizes, predicates, indices)) { + // We can strengthen the invariant to say the array is equal outside the + // slice visited by the for loop as well (note: this isn't quite right if, + // e.g., the loop isn't a basic "step 1, write to arr[i]", but its pretty + // hard to do much better in general) + + // Add a strengthening that asserts that the array outside the slice visited + // by the loop is equivalent. So for an array write at index f(k...), + // say something like: forall x..., (x \not\in R) /\ (f(x...) in array + // bounds) -> predicate + + auto missesSlice = [this, &loopBounds, &index, &loopCounters, + &size](ArrayRef xs) { + SmallVector xNotInRange; + for (auto [x, range] : llvm::zip(xs, loopBounds)) { + xNotInRange.push_back(valueInRange(x, range, mgr).notTerm()); + } + auto arrayAccessIndex = + index.substitute({loopCounters.begin(), loopCounters.end()}, xs); + Range arrayBounds{mgr.mkInteger(0), mgr.mkInteger(size), + mgr.mkInteger(1)}; + + return mgr.mkTerm(cvc5::Kind::AND, + {disjunctAll(xNotInRange, mgr), + valueInRange(arrayAccessIndex, arrayBounds, mgr)}); + }; + strengthenings.push_back( + quantifyPredicate(predicate, loopCounters, missesSlice, mgr)); + + // TODO: do something smarter here + // strengthenings.push_back( + // quantifyPredicate(predicate, i, builder.getInteger(0), lb, step)); + // strengthenings.push_back( + // quantifyPredicate(predicate, i, ub, builder.getInteger(size), step)); + } + + auto strengthened = conjunctAll(strengthenings, mgr); + auto strengthenedPrecondition = + conjunctAll({bodyPrecondition, strengthened}, mgr); + + for (auto [size, predicate] : llvm::zip(arraySizes, predicates)) { + auto postcondition = ConjunctionTerm::of(quantifyPredicate( + predicate, loopCounters, + [this, &loopCounters, &loopBounds](auto xs) { + return disjunctAll( + {getLoopAntecedent(xs, loopCounters, loopBounds, mgr), + currentIterationTuple(xs, loopCounters, mgr)}, + mgr); + }, + mgr)); + + llvm::dbgs() << postcondition.buildTerm(mgr).toString() << "\n"; + + // Verify {strengthenedPrecondition} loopBody {postcondition} to show the + // predicate is inductive + calculateWP(body, postcondition); + auto isInductive = + mgr.mkTerm(cvc5::Kind::IMPLIES, + {strengthenedPrecondition, postcondition.buildTerm(mgr)}); + // llvm::dbgs() << "Is inductive: " << isInductive.toString() << "\n"; + auto query = buildSMTQuery(isInductive, builder, field); + // llvm::dbgs() << invariant.toString() << "\n"; + llvm::dbgs() << "Checking whether [" << predicate.toString() + << "] is inductive\n"; + llvm::dbgs() << query << "\n"; + if (checkUnsatWithZ3(query)) { + llvm::dbgs() << "Predicate " << predicate.toString() << " is inductive\n"; + inductivePredicates.push_back(predicate); + } + } + + // Check that the resulting predicate entails the postcondition + auto inductiveInvariant = conjunctAll(inductivePredicates, mgr); + auto withinLoopBounds = [this, &loopCounters, + &loopBounds](ArrayRef xs) { + SmallVector xInBound = + llvm::map_to_vector(llvm::zip(xs, loopBounds), [&](auto pair) { + auto [x, range] = pair; + return valueInRange(x, range, mgr); + }); + return conjunctAll(xInBound, mgr); + }; + inductiveInvariant = quantifyPredicate(inductiveInvariant, loopCounters, + withinLoopBounds, mgr); + + llvm::dbgs() << "Checking invariant " << inductiveInvariant.toString() + << "\n"; + + auto entailsPostcondition = postcondition; + entailsPostcondition.addAntecedent(inductiveInvariant); + entailsPostcondition.addAntecedent(strengthened); + + auto query = + buildSMTQuery(entailsPostcondition.buildTerm(mgr), builder, field); + llvm::dbgs() << query << "\n"; + if (checkUnsatWithZ3(query)) { + return strengthened; + } else { + auto failingCore = + getFailingCore(conjunctAll({inductiveInvariant, strengthened}, mgr), + postcondition, builder, field); + for (auto [ann, elem] : + llvm::zip(failingCore.annotations, failingCore.terms)) { + llvm::dbgs() << "Loop invariant was not strong enough to prove: " + << elem.toString() << "\n"; + // NOTE: Just asserting the full thing, even when its an array, should be + // fine. Asserting equivalence of the full array should never overlap with + // something provable by the invariant, because the "slice" strengthenings + // we added above already covered the "rest" of any array mentioned in the + // invariant. + strengthenings.push_back(elem); + } + // TODO: Technically we should check here that the strengthened thing + // entails the postcondition; though it trivially should since we've added + // everything that was missing + return conjunctAll(strengthenings, mgr); + } + + // TODO: add strengthenings +} + +void WeakestPreconditionAnalysis::addEquivalentMember( + component::MemberDefOp memberDef) { + builder.addEquivalentMember(memberDef); +} + // TODO: I *think* its enough to implement subcmp calls to @compute/@constrain // in here since writing to the subcmp member should handle the assertion, and: // (1) If the top struct was aligned mechanically the SSA values being written // to _w and _c should be distinct, and // (2) Otherwise if they aren't distinct, it should still be correct to assert // these two (init-...) invocations equal? -cvc5::Term WeakestPreconditionAnalysis::getExpression(Operation *op) { +mlir::FailureOr +WeakestPreconditionAnalysis::getExpression(Operation *op) { static llvm::DenseMap opToTermKind = { {"felt.add", cvc5::Kind::ADD}, {"felt.sub", cvc5::Kind::SUB}, {"felt.mul", cvc5::Kind::MULT}, {"felt.smod", cvc5::Kind::INTS_MODULUS}, - {"felt.sintdiv", cvc5::Kind::INTS_DIVISION}}; + {"felt.sintdiv", cvc5::Kind::INTS_DIVISION}, + {"felt.div", cvc5::Kind::INTS_DIVISION}}; if (auto it = opToTermKind.find(op->getName().getStringRef()); it != opToTermKind.end()) { SmallVector operandTerms{ llvm::map_to_vector(op->getOperands(), [this](Value value) { - return builder.getConstant(value); + return getExpression(value); })}; return mgr.mkTerm(it->second, {operandTerms.begin(), operandTerms.end()}); } - return llvm::TypeSwitch(op) + return llvm::TypeSwitch>(op) .Case([this](MemberReadOp read) { return builder.getConstant(read.getMemberDefOp(tables)->get(), isWitnessOp(read)); @@ -72,7 +553,9 @@ cvc5::Term WeakestPreconditionAnalysis::getExpression(Operation *op) { .Case([this](ReadArrayOp read) { llzk::ensure(read.getIndices().size() == 1, "multidimensional arrays are not supported"); - return builder.arrayRead(read.getArrRef(), read.getIndices().front()); + return builder.arrayRead( + builder.getExpression(read.getArrRef()), + builder.getExpression(read.getIndices().front())); }) .Case([this](FeltConstantOp constOp) { SmallString<64> str; @@ -84,6 +567,13 @@ cvc5::Term WeakestPreconditionAnalysis::getExpression(Operation *op) { return builder.getInteger(val); }) .Case([this](array::CreateArrayOp createArr) { + // If the array is written to exactly one struct member later, just + // materialize a symbol for that directly + auto destination = getArrayDestination(createArr.getResult()); + if (destination.has_value()) { + return builder.getConstant(destination->getMemberName(), + createArr.getType(), true); + } return builder.getConstant(createArr.getResult()); }) .Case([this](llzk::function::CallOp call) { @@ -97,8 +587,10 @@ cvc5::Term WeakestPreconditionAnalysis::getExpression(Operation *op) { return builder.initSubcmp( target->get()->getParentOfType(), args); }) - .Default([op](auto) -> cvc5::Term { - llvm::report_fatal_error("unknown op: " + op->getName().getStringRef()); + .Default([op](auto) { + return failure(); + // llvm::report_fatal_error("unknown op: " + + // op->getName().getStringRef()); }); } @@ -111,7 +603,8 @@ static inline bool valueIsSignalRead(Value val, SymbolTableCollection &tables) { if (failed(memberDef)) { return false; } - return memberDef->get().getSignal(); + return true; + // return memberDef->get().getSignal(); } return false; } @@ -124,12 +617,14 @@ static inline bool valueIsSignalWrite(Value val, if (failed(memberDef)) { return false; } - return memberDef->get().getSignal(); + return true; + // return memberDef->get().getSignal(); } } return false; } +// TODO: Use TermBuilder to populate expressions instead of substitution void WeakestPreconditionAnalysis::calculateWP(Operation *op, ConjunctionTerm &postcondition) { llvm::TypeSwitch(op) @@ -164,6 +659,17 @@ void WeakestPreconditionAnalysis::calculateWP(Operation *op, .Case([this, &postcondition](scf::IfOp op) { calculateWP(op, postcondition); }) + .Case([this](auto) { return; }) + .Case([this, &postcondition](scf::ForOp op) { + auto invariant = computeInvariant(op, postcondition); + llzk::ensure(succeeded(invariant), + "failed to infer invariant for loop"); + // It should already be the case that invariant => postcondition + postcondition = ConjunctionTerm::of(*invariant); + }) + .Case([this, &postcondition](smt::AssertOp op) { + postcondition.addAntecedent(builder.getExpression(op.getInput())); + }) .Case([this, &postcondition]( llzk::function::CallOp call) { if (call.calleeIsConstrain()) { @@ -180,12 +686,16 @@ void WeakestPreconditionAnalysis::calculateWP(Operation *op, } else { // Do the default (there's gotta be a better way) auto expression = getExpression(call); + llzk::ensure(succeeded(expression), + "unknown op: " + call->getName().getStringRef()); postcondition.substitute(builder.getConstant(call->getResult(0)), - expression); + *expression); } }) .Default([this, &postcondition](auto op) { - auto expression = getExpression(op); + auto expression = builder.getExpression(op->getResult(0)); + // llzk::ensure(succeeded(expression), + // "unknown op: " + op->getName().getStringRef()); postcondition.substitute(builder.getConstant(op->getResult(0)), expression); }); @@ -218,29 +728,42 @@ void WeakestPreconditionAnalysis::calculateWP(mlir::scf::IfOp ifOp, postcondition = thenBranch; } -cvc5::Term WeakestPreconditionAnalysis::getPostcondition() { +ImplicationTerm WeakestPreconditionAnalysis::getPostcondition() { auto members = structDef.getMemberDefs(); llzk::ensure(!members.empty(), "cannot build postcondition for struct with empty members"); - std::vector memberEquivs; + SmallVector memberEquivs; + SmallVector> annotations; for (auto memberDef : members) { auto witnessSym = builder.getConstant(memberDef, true); auto constraintSym = builder.getConstant(memberDef, false); + if (auto arrType = dyn_cast(memberDef.getType())) { + llzk::ensure(arrType.getShape().size() == 1, + "multidimensional arrays not yet supported"); + + auto size = arrType.getShape().front(); + annotations.push_back( + Annotation{true, + {{builder.getInteger(0), builder.getInteger(size), + builder.getInteger(1)}}}); + } else { + annotations.push_back(Annotation{false, std::nullopt}); + } memberEquivs.push_back(builder.assertEqual(witnessSym, constraintSym)); } - if (memberEquivs.size() > 1) { - return mgr.mkTerm(cvc5::Kind::AND, memberEquivs); - } - return memberEquivs.front(); + return ImplicationTerm{{}, memberEquivs, annotations}; } void WeakestPreconditionAnalysis::populateVerificationConditions() { llzk::ensure(succeeded(ensureProductFunc( structDef->getParentOfType(), structDef)), "failed to align product func"); + + llvm::dbgs() << structDef << "\n----\n"; + auto postcondition = ConjunctionTerm::of(getPostcondition()); calculateWP(&structDef.getProductFuncOp().getFunctionBody().front(), postcondition); diff --git a/scripts/collect_circom_demo_results.py b/scripts/collect_circom_demo_results.py new file mode 100644 index 0000000..3de72c0 --- /dev/null +++ b/scripts/collect_circom_demo_results.py @@ -0,0 +1,221 @@ +import argparse +import csv +import multiprocessing +import pathlib +import re +import subprocess +import time + +ENTRYPOINT_RE = re.compile( + r"llzk\.main\s*=\s*!struct\.type<@([A-Za-z0-9_]+)(?:::@[A-Za-z0-9_]+)?<", + re.ASCII, +) +VERIFY_COUNTEREXAMPLE_RE = re.compile(r"^- @", re.MULTILINE) +VERIFY_UNKNOWN_RE = re.compile(r"^\* @", re.MULTILINE) +SAT_RE = re.compile(r"^\s*sat\s*$", re.MULTILINE) +UNSAT_RE = re.compile(r"^\s*unsat\s*$", re.MULTILINE) +UNKNOWN_RE = re.compile(r"^\s*unknown\s*$", re.MULTILINE) + + +def get_benchmarks(benchmark_dir: pathlib.Path) -> list[tuple[str, pathlib.Path, str]]: + benchmarks: list[tuple[str, pathlib.Path, str]] = [] + for llzk_file in sorted(benchmark_dir.glob("*.llzk")): + root_struct = get_root_struct(llzk_file) + if root_struct is None: + continue + benchmarks.append((llzk_file.stem, llzk_file, root_struct)) + return benchmarks + + +def get_root_struct(llzk_file: pathlib.Path) -> str | None: + with llzk_file.open(encoding="utf-8") as handle: + for line in handle: + if match := ENTRYPOINT_RE.search(line): + return match.group(1) + return None + + +def classify_verify(stdout: str) -> tuple[str, str]: + if VERIFY_UNKNOWN_RE.search(stdout): + return ("partial", "verification finished with unknown members") + if VERIFY_COUNTEREXAMPLE_RE.search(stdout): + return ("counterexample", "") + return ("verified", "") + + +def run_verify( + benchmark: str, + llzk_file: pathlib.Path, + root_struct: str, + lleq_bin: str, + timeout: float, +) -> tuple[str, str, str, str, str, str]: + args = [lleq_bin, "verify", "--flatten", "--struct", root_struct, str(llzk_file)] + start = time.perf_counter() + try: + proc = subprocess.run(args, capture_output=True, text=True, timeout=timeout) + except subprocess.TimeoutExpired: + elapsed = time.perf_counter() - start + return (benchmark, root_struct, "verify", "timeout", f"{elapsed:.6f}", "timeout") + + elapsed = time.perf_counter() - start + if proc.returncode != 0: + message = (proc.stderr or proc.stdout).strip()[:500] + return (benchmark, root_struct, "verify", "error", f"{elapsed:.6f}", message) + + result, message = classify_verify(proc.stdout) + message = message or proc.stdout.strip()[:500] + return (benchmark, root_struct, "verify", result, f"{elapsed:.6f}", message) + + +def run_wp( + benchmark: str, + llzk_file: pathlib.Path, + root_struct: str, + lleq_bin: str, + cvc5_bin: str, + timeout: float, +) -> tuple[str, str, str, str, str, str]: + lleq_args = [lleq_bin, "wp", "--struct", root_struct, str(llzk_file)] + cvc5_args = [cvc5_bin, "--produce-models"] + start = time.perf_counter() + + try: + lleq_proc = subprocess.Popen( + lleq_args, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + cvc5_proc = subprocess.Popen( + cvc5_args, + stdin=lleq_proc.stdout, + stdout=subprocess.PIPE, + stderr=subprocess.PIPE, + text=True, + ) + assert lleq_proc.stdout is not None + lleq_proc.stdout.close() + cvc5_stdout, cvc5_stderr = cvc5_proc.communicate(timeout=timeout) + lleq_stdout, lleq_stderr = lleq_proc.communicate(timeout=1) + except subprocess.TimeoutExpired: + elapsed = time.perf_counter() - start + lleq_proc.kill() + cvc5_proc.kill() + lleq_proc.communicate() + cvc5_proc.communicate() + return (benchmark, root_struct, "wp", "timeout", f"{elapsed:.6f}", "timeout") + + elapsed = time.perf_counter() - start + if lleq_proc.returncode != 0: + message = (lleq_stderr or lleq_stdout).strip()[:500] + return (benchmark, root_struct, "wp", "error", f"{elapsed:.6f}", message) + if cvc5_proc.returncode != 0: + message = (cvc5_stderr or cvc5_stdout).strip()[:500] + return (benchmark, root_struct, "wp", "error", f"{elapsed:.6f}", message) + if UNSAT_RE.search(cvc5_stdout): + return (benchmark, root_struct, "wp", "verified", f"{elapsed:.6f}", "unsat") + if SAT_RE.search(cvc5_stdout): + return (benchmark, root_struct, "wp", "counterexample", f"{elapsed:.6f}", "sat") + if UNKNOWN_RE.search(cvc5_stdout): + return (benchmark, root_struct, "wp", "partial", f"{elapsed:.6f}", "unknown") + + message = (cvc5_stdout or cvc5_stderr).strip()[:500] + return (benchmark, root_struct, "wp", "error", f"{elapsed:.6f}", message) + + +def run_task( + benchmark: str, + llzk_file: pathlib.Path, + root_struct: str, + mode: str, + lleq_bin: str, + cvc5_bin: str, + timeout: float, +) -> tuple[str, str, str, str, str, str]: + if mode == "verify": + return run_verify(benchmark, llzk_file, root_struct, lleq_bin, timeout) + return run_wp(benchmark, llzk_file, root_struct, lleq_bin, cvc5_bin, timeout) + + +def main() -> None: + parser = argparse.ArgumentParser( + description="Collect LLEQ verification data for examples/circom-demo." + ) + parser.add_argument( + "--benchmark-dir", + default="examples/circom-demo", + help="Directory containing optimized LLZK demo examples.", + ) + parser.add_argument( + "--lleq-bin", + default="./build/tools/lleq/lleq", + help="Path to the lleq binary.", + ) + parser.add_argument( + "--cvc5-bin", + default="/nix/store/hxfws6z4z0c3d8l87pr4lfz672vxp32d-cvc5-1.3.1/bin/cvc5", + help="Path to the cvc5 binary.", + ) + parser.add_argument( + "--timeout", + type=float, + default=120.0, + help="Per-benchmark timeout in seconds.", + ) + parser.add_argument( + "--nthreads", + type=int, + default=multiprocessing.cpu_count(), + help="Number of jobs to run at once.", + ) + parser.add_argument( + "--output", + default="examples/circom-demo/verification_results.csv", + help="CSV path for collected results.", + ) + args = parser.parse_args() + + benchmark_dir = pathlib.Path(args.benchmark_dir).resolve() + benchmarks = get_benchmarks(benchmark_dir) + tasks: list[tuple[str, pathlib.Path, str, str, str, str, float]] = [] + for benchmark, llzk_file, root_struct in benchmarks: + tasks.append( + (benchmark, llzk_file, root_struct, "verify", args.lleq_bin, args.cvc5_bin, args.timeout) + ) + tasks.append( + (benchmark, llzk_file, root_struct, "wp", args.lleq_bin, args.cvc5_bin, args.timeout) + ) + + with multiprocessing.Pool(args.nthreads) as pool: + results = pool.starmap(run_task, tasks) + + results.sort() + output_path = pathlib.Path(args.output).resolve() + with output_path.open("w", encoding="utf-8", newline="") as handle: + writer = csv.writer(handle) + writer.writerow( + ["Benchmark", "Root Struct", "Mode", "Result", "Time Seconds", "Message"] + ) + writer.writerows(results) + + counts = { + "verified": 0, + "counterexample": 0, + "partial": 0, + "timeout": 0, + "error": 0, + } + for _, _, _, result, _, _ in results: + counts[result] += 1 + + print( + "verified: {verified}, counterexample: {counterexample}, partial: {partial}, timeout: {timeout}, error: {error}".format( + **counts + ) + ) + print(f"results: {output_path}") + + +if __name__ == "__main__": + main() diff --git a/tools/lleq/main.cpp b/tools/lleq/main.cpp index b11ff2e..b46dd32 100644 --- a/tools/lleq/main.cpp +++ b/tools/lleq/main.cpp @@ -5,6 +5,8 @@ #include "Analysis/SymbolicStore.h" #include "Verification/FixpointVerifier.h" +#include "Verification/SymbolicVerifier.h" +#include "Verification/VerificationUtils.h" #include "Verification/WeakestPrecondition.h" #include "lleq/CliOptions.h" #include @@ -183,25 +185,22 @@ int main(int argc, char **argv) { // already emits an error return EXIT_FAILURE; } + WeakestPreconditionAnalysis analysis{structDef, *field}; + SymbolicVerifier symbolicStore{structDef}; + if (failed(symbolicStore.buildStore())) { + llvm::errs() << "Failed to build symbolic store\n"; + return EXIT_FAILURE; + } + + for (auto memberDef : structDef.getMemberDefs()) { + if (symbolicStore.areEquivalent(memberDef.getSymName())) { + analysis.addEquivalentMember(memberDef); + } + } + analysis.emit(llvm::outs()); - // analysis.populateVerificationConditions(); - // auto vc = analysis.verificationConditions; - // auto decls = analysis.extraDecls; - // auto bounds = analysis.declBounds; - // llvm::outs() << "(set-logic ALL)\n"; - // llvm::outs() << "; Extra declarations\n"; - // for (auto decl : decls) { - // llvm::outs() << "(declare-const " << decl.toString() << " " - // << decl.getSort().toString() << ")\n"; - // } - // llvm::outs() << "; Bounds\n"; - // for (auto bound : bounds) { - // llvm::outs() << "(assert " << bound.toString() << ")\n"; - // } - // llvm::outs() << "; Verification condition\n"; - // llvm::outs() << "(assert " << vc.notTerm().toString() << ")\n"; - // llvm::outs() << "(check-sat)\n(get-model)\n"; + return EXIT_SUCCESS; } case cli::SubCmd::Verify: